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: Выбирайте только таблицы, состоящие из простых полей (т.е. без вложенных таблиц и структур).