Доброго времени суток, в этой статье хочу рассказать о своём опыте работы с BI Publisher и составлении шаблонов для MS Excel в родном для этой программы формате *.xls.
Небольшое предисловие
Работая с Oracle eBS, время от времени возникает необходимость создания дополнительных репортов (а соответственно и шаблонов в BI Publisher). В данном случае был довольно сложный репорт, который собирался из таблиц, заполняющихся данными в BEFORE REPORT триггере этого же репорта. Количество колонок в репорте могло динамичиски меняться.
Первоначально шаблон был сделан в формате RTF. Для каждого количества колонок был предусмотрен свой вариант репорта. На выходе мы должны были получить XLS файл с желаемыми для нас данными.
Возникшие проблемы
Когда выходящий файл является XLS файлом мы можем столкнуться со следующими проблемами, или если быть более точными, ограничениями:
1) Мы хотим чтобы Excel output файл выглядел именно, так как нам нужно — нужные столбцы находились именно там, где нам нужно, а не уезжали куда-то.
2) Чтобы типы данных передавались в Excel output, то есть чтобы у чисел был числовой тип данных в Excel, у дат — тип даты, и тому подобное…
3) При передачи данных, которые начинаются с «0» (leading zeroes), ведущие нули обрезаются, то есть нам нужно сохранить целостность данных.
4) Та же проблема появляется и при передачи данных с нулями после запятой (дробной частью).
Если 3 и 4 проблемы можно решить добавив два пробела или специальные символы в начало/конец аттрибута, то с остальными немного сложнее.
В моём случае мне нужно было передать значение «0000» в Excel при этом не потеряв ни одного нуля и не допуская никаких других символов в клетке.
Подробнее о других ограничения Excel output файлов, созданных с использованием RTF шаблонов можно прочитать здесь
Озарение
В результате долгих поисков в интернетах, в блоге Oracle было найдено упомянание о Real Excel Template.
То есть теперь можно создавать шаблоны не отходя от кассы не покидая MS Excel. Для этого нам нужно создать стандартный *.XLS файл и начать воять в нём наш чудо-шаблон.
Для начала немного о различиях между RTF и XLS шаблонами.
1) В RTF для обозначения элементов мы должны были ставить тег <?ELEMENT_NAME?>
, а в XLS мы должны писать в свойствах ячейки, где у нас будет находиться элемент тег XDO_?ELEMENT_NAME?
. Пример:
2) В RTF для обозначания открытия групп мы должны были ставить тег <? for-each: GROUP_NAME?>
и для закрытия групп должны были ставить тег <?end for-each?>
,a в XLS мы должны выделить ячейки, которые будут заполнены данными из нашей группы и поставить им в качестве свойства XDO_GROUP_?GROUP_NAME?
. Это быдет выглядеть так:
3) Будьте внимательными с тем, что пишете в самой клетке, так как вы можете задавать тип данных, которые будут находиться в клетке с помощью обычного Excel функционала, то и то, что написано в клетке должно соответствовать этому типу. Единственное, что у меня не получилось, это получить на выходе дату как даты, пришлось писать для этого небольшой макрос. Ах да, теперь мы можем дополнять наши габлоны макросами, что не было возможно в RTF шаблонах для Excel.
4) Обязательно должна присутствовать отдельная вкладка XDO_METADATA:
Всё, что написано до «Data Constraints:» включая менять не нужно и это должно присутствовать во всех XLS шаблонах. То, что ниже уже ваши функции. Поддерживается XSL, не знаю насчёт остальных. Если элемент находится вне групп, то его нужно получать через xsl:value-of select
. Ко всем элементам в этой вкладке нужно обращаться через .//ELEMENT_NAME.
Послесловие
При использовании XLS шаблона мне больше не нужно было создавать для каждого поличества колонок отдельный вариант таблицы. Достаточно сделать таблицу для максимального количества колонок. Колонки, в которых будут присутствовать данные будут заполняться автоматически, в которых данных не будет так и будут оставаться пустыми. Это позволяет избежать лишней работы.
Дополнительную информацию по возможностям создания таких шаблонов можно найти по этой ссылке.
Надеюсь кому-то это поможет избежать лишних хлопот с составление шаблонов.
Автор: InTrX