Доброго времени суток, в этой статье хочу рассказать о своём опыте работы с 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 для обозначения элементов мы должны были ставить тег

2) В RTF для обозначания открытия групп мы должны были ставить тег

3) Будьте внимательными с тем, что пишете в самой клетке, так как вы можете задавать тип данных, которые будут находиться в клетке с помощью обычного Excel функционала, то и то, что написано в клетке должно соответствовать этому типу. Единственное, что у меня не получилось, это получить на выходе дату как даты, пришлось писать для этого небольшой макрос. Ах да, теперь мы можем дополнять наши габлоны макросами, что не было возможно в RTF шаблонах для Excel.
4) Обязательно должна присутствовать отдельная вкладка XDO_METADATA:

Всё, что написано до «Data Constraints:» включая менять не нужно и это должно присутствовать во всех XLS шаблонах. То, что ниже уже ваши функции. Поддерживается XSL, не знаю насчёт остальных. Если элемент находится вне групп, то его нужно получать через
При использовании 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.
То есть теперь можно создавать шаблоны
Для начала немного о различиях между 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 шаблона мне больше не нужно было создавать для каждого поличества колонок отдельный вариант таблицы. Достаточно сделать таблицу для максимального количества колонок. Колонки, в которых будут присутствовать данные будут заполняться автоматически, в которых данных не будет так и будут оставаться пустыми. Это позволяет избежать лишней работы.
Дополнительную информацию по возможностям создания таких шаблонов можно найти по этой ссылке.
Надеюсь кому-то это поможет избежать лишних хлопот с составление шаблонов.