3.2.6 Опция Пост-обработки OLE/VBScript
Предисловие
Как уже было сказано ранее, XLSX-файл формируется на сервере приложений, без участия дополнительных приложений, и в подавляющем большинстве случаев этого бывает достаточно.
Однако, в ряде случаев к форме предъявляются особые требования, которые невозможно учесть при компоновке XLSX-файла. И в этом случае всё же приходится дополнительно обрабатывать полученный XLSX-файл посредством приложения MS Excel.
В XLSX Workbench процедура дополнительной обработки (пост-обработки) реализована посредством OLE/ VBScript (в зависимости от настроек) и запускается только в том случае, если вы при разработке формы задействовали соответствующие опции.
Примечание: Рекомендуется применять пост-обработку только при крайней необходимости, т.к. она имеет ряд негативных моментов:
Она не будет выполнена при запуске программы печати в фоновом режиме
Она не будет выполнена при отсутствии приложения MS Excel на локальной машине пользователя
Увеличивается время получения готовой формы
Контроль автоматических разрывов страниц
Например, мы не хотим, чтобы автоматический разрыв страницы случайно оказался внутри определенной области листа (например, в блоке подписей футера). Автоматические (обозначенные пунктиром) разрывы страниц не могут быть заранее имплементированы в XLSX-файле - они расставляются приложением в момент открытия документа, исходя из настроек принтера и т.д. Соответственно, мы не знаем о них до момента открытия документа. Обычно для решения этой проблемы используется VBA-макрос, который запустится после открытия документа и сдвинет автоматический разрыв страницы с требуемой области.
Примечание: в XLSX-Workbench вам не нужно создавать макрос, требуется только включить соответствующую опцию в компоненте "Папка". Эта опция будет применена в процессе Пост-обработки документа посредством OLE/VBScript:
Подбор размеров объединенных ячеек по объему текста
Если ячейка не объединенная, то автоподбор ширины или высоты настраивается в её свойствах в Excel-шаблоне и прекрасно работает. Однако, для объединенных ячеек эта опция, к сожалению, бесполезна. Чтобы решить эту проблему, обычно прибегают к VBA-макросу.
Примечание: в XLSX-Workbench вам не нужно создавать макрос, требуется только включить соответствующую опцию в любом из компонентов: "Паттерн", "Масштабируемый паттерн", "Грид" . Эта опция будет применена в процессе Пост-обработки документа посредством OLE/VBScript:
Заключительная пост-обработка для реализации собственной логики
Для реализации каких-либо других, нестандартных требований к форме, в XLSX-Workbench предусмотрена возможность запуска Заключительной пост-обработки - заранее подготовленной вами процедуры (макроса) на языке VBScript. Что примечательно - вы можете передать в данный макрос для обработки содержимое таблиц из контекста. Заключительная пост-обработка выполняется непосредственно после вызова выше описанных процедур Контроля автоматических разрывов страниц и Подбора размеров объединенных ячеек.
Как известно, формат XLSX не может содержать VBA-макросы. Однако, мы можем через OLE запустить выполнение VBScript-процедуры. Что интересно, VBScript работает даже с максимальным уровнем настроек безопасности в MS Excel !
VBScript является разновидностью VBA, и мало чем от него отличается. Но различия всё же есть, и подробнее о них вы можете узнать здесь. Например в VBScript есть следующие ограничения:
объявляемые переменные и аргументы процедур/функций не типизируются (т.е. имеют тип Variant);
при вызове процедур/функций, передача именованных аргументов не поддерживается - используйте порядок следования аргументов;
не поддерживается отладка. По этому, я рекомендую писать и отлаживать макрос в VBA-среде, и уже готовый код вставлять в VBScript-редактор Заключительной пост-обработки.
Для того, чтобы создать процедуру Заключительной пост-обработки, необходимо выделить корневой узел структуры формуляра. На вкладке свойств, в пункте Заключительная пост-обработки, нажмите на кнопку VBScript. В результате, откроется окно редактора :
Вы можете вставить свой код внутри Sub-процедуры Entry (это и есть процедура Заключительной пост-обработки).
Вы также можете добавлять и другие процедуры и функции, однако, процедура Entry должна присутствовать обязательно - именно она является точкой входа для Заключительной пост-обработки.
Примечание: Вместо объектов Application и ActiveWorkbook необходимо использовать объекты XLWB_Application и XLWB_ActiveWorkbook .
Код
Результат
Пример 1 - Вывод простого сообщения
Sub Entry()
MsgBox("This is Test message")
End Sub
Пример 2 - Подсчет количества печатных страниц в отчете
Sub Entry()
Set MySheet = XLWB_ActiveWorkbook.ActiveSheet
PgCount = MySheet.HPageBreaks.Count + 1
MySheet.Range("A1").Value = "The report contains " _
& PgCount & " pages"
End Sub
Пример 3 - Вызов функции с параметрами
Sub Entry()
Call PasteValues("These", _
"are", _
"function's", _
"arguments")
End Sub
Function PasteValues(param1, param2, param3, param4)
Set MySheet = XLWB_ActiveWorkbook.ActiveSheet
MySheet.Cells(1, 1).Value = param1
MySheet.Cells(1, 2).Value = param2
MySheet.Cells(1, 3).Value = param3
MySheet.Cells(1, 4).Value = param4
End Function
Пример 4 - Передача в макрос данных из таблиц контекста
Sub Entry()
' add new worksheet
Set MySheet = XLWB_ActiveWorkbook.Sheets.Add
MySheet.Name = "TestVBScript"
' get table, which we have chosen from context and named T_LABELS
Set MyTable = XLWB_ActiveWorkbook.Container.Tables("T_LABELS").Table
' loop at table
For i = 1 To MyTable.Rows.Count
Set MyTableRow = MyTable.Rows(i)
MySheet.Cells(i, 1).Value = MyTableRow.Cell(1) 'Name
MySheet.Cells(i, 2).Value = MyTableRow.Cell(2) 'Street
MySheet.Cells(i, 3).Value = MyTableRow.Cell(3) 'Town
MySheet.Cells(i, 4).Value = MyTableRow.Cell(4) 'State
MySheet.Cells(i, 5).Value = MyTableRow.Cell(5) 'Zip
Next
End Sub
В примере 4 демонстрируется доступ к таблице T_LABELS , переданной из контекста. Для того, чтобы передать таблицу из контекста в процедуру Заключительной пост-обработки, необходимо нажать на кнопку
Откроется экран, содержащий список таблиц контекста, доступных для передачи. Необходимо установить чекбокс для тех таблиц, которые вы хотите передать в процедуру Заключительной пост-обработки, а также, присвоить им имена, под которыми они будут доступны в этой процедуре.
Примечание 1: Доступны для выбора только таблицы, находящиеся на верхнем уровне вложенности контекста.
Примечание 2: Выбирайте только таблицы, состоящие из простых полей (т.е. без вложенных таблиц и структур).