3.1.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. В результате, откроется окно редактора :

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