Этот пост о том как создавать отчеты, выводящиеся в Excel с использованием XML Publisher.
На проекте необходимо было создать отчет в Excel. Проблема состояла в том, что в шаблоне было около 100 столбцов - поэтому вариант с созданием шаблона в RTF и последующим его выводом в виде Excel отпала сразу. Вариант с преобразованием шаблона в формате Excel в книгу XML и последующим выводом тегов из пакета тоже отпал - из-за настройки базы и аппсов русские символы, генерируемые в пакете, в итоге выводились в виде кракозябок. Выход был найден.
1. Создается шаблон в Excel. В поля, в которых хотим сделать вывод переменных пишем :PARAM_NAME: - ОБЯЗАТЕЛЬНО с двух сторон двоеточия - точки входа и выхода.
2. Сохраняем документ в формате книги XML
3. Разделяем наш файл по строкам на неизменяемые части - шапка, подвал, и на изменяемые - те что будут выводиться в цикле и заполняться данными.
4. Создаем таблицу, в которой будем хранить уникальный идентификатор нашего отчета, уникальный идентификатор части отчета (шапки, подвала, изменяемой части), описание этой самой части и поле типа CLOB для хранения куска XML с этой самой частью.
Чтобы не возникло проблем с кодировкой, правим:
<?xml version="1.0" encoding="windows-1251"?>
Чтобы не выдавало ошибок при генерированиии большого количества строк ( по умолчанию часть ExpandedRowCount равна около 300 строк), правим:
<Table ss:ExpandedColumnCount="19" ss:ExpandedRowCount="65000" x:FullColumns="1"
5. В пакете производим вывод нужных частей
Для вывода я создавала параллельную программу, с исполняемым файлом - процедурой из пакета. При отработке запроса в файле результатов формируется xml документ и ОЕБС автоматически открывает его в Excel, таким образом получая нужный нам вид отчета.
На проекте необходимо было создать отчет в Excel. Проблема состояла в том, что в шаблоне было около 100 столбцов - поэтому вариант с созданием шаблона в RTF и последующим его выводом в виде Excel отпала сразу. Вариант с преобразованием шаблона в формате Excel в книгу XML и последующим выводом тегов из пакета тоже отпал - из-за настройки базы и аппсов русские символы, генерируемые в пакете, в итоге выводились в виде кракозябок. Выход был найден.
1. Создается шаблон в Excel. В поля, в которых хотим сделать вывод переменных пишем :PARAM_NAME: - ОБЯЗАТЕЛЬНО с двух сторон двоеточия - точки входа и выхода.
2. Сохраняем документ в формате книги XML
3. Разделяем наш файл по строкам на неизменяемые части - шапка, подвал, и на изменяемые - те что будут выводиться в цикле и заполняться данными.
4. Создаем таблицу, в которой будем хранить уникальный идентификатор нашего отчета, уникальный идентификатор части отчета (шапки, подвала, изменяемой части), описание этой самой части и поле типа CLOB для хранения куска XML с этой самой частью.
Чтобы не возникло проблем с кодировкой, правим:
<?xml version="1.0" encoding="windows-1251"?>
Чтобы не выдавало ошибок при генерированиии большого количества строк ( по умолчанию часть ExpandedRowCount равна около 300 строк), правим:
<Table ss:ExpandedColumnCount="19" ss:ExpandedRowCount="65000" x:FullColumns="1"
5. В пакете производим вывод нужных частей
/* Сводный отчет */
PROCEDURE SVODNIJ(P_ORG_ID NUMBER, P_YEAR VARCHAR2, P_TYPE VARCHAR2, P_DATA_VALUE VARCHAR2, P_VARIANT VARCHAR2) IS
body_ clob;
BEGIN
-- Вывод шапки отчета
body_ := xx_utils.get_xml_body(145, 11);
body_ := xx_utils.reps(':FILIAL:',GET_ORG_NAME(P_ORG_ID), body_);
body_ := xx_utils.reps(':YEAR:', GET_YEAR(P_YEAR), body_);
xx_utils.put_line(body_);
PROCEDURE SVODNIJ(P_ORG_ID NUMBER, P_YEAR VARCHAR2, P_TYPE VARCHAR2, P_DATA_VALUE VARCHAR2, P_VARIANT VARCHAR2) IS
body_ clob;
BEGIN
-- Вывод шапки отчета
body_ := xx_utils.get_xml_body(145, 11);
body_ := xx_utils.reps(':FILIAL:',GET_ORG_NAME(P_ORG_ID), body_);
body_ := xx_utils.reps(':YEAR:', GET_YEAR(P_YEAR), body_);
xx_utils.put_line(body_);
________________________________________
function get_xml_body(p_report_id number, --ID отчета
p_body_id number--ID строки отчета
) return clob as
xml_clob clob;
begin
select t.xml_body
into xml_clob
from xx_reports t
where t.report_id = p_report_id
and t.body_id = p_body_id;
return xml_clob;
exception
when others then
return null;
end get_xml_body;
p_body_id number--ID строки отчета
) return clob as
xml_clob clob;
begin
select t.xml_body
into xml_clob
from xx_reports t
where t.report_id = p_report_id
and t.body_id = p_body_id;
return xml_clob;
exception
when others then
return null;
end get_xml_body;
__________________________
function reps(var in varchar2, --Что заменяется
val in varchar2, --На что заменяется
sou in clob --Источник замены
) return clob as
begin
--return replace(sou, var, convert(val, 'UTF8', 'CL8MSWIN1251'));
return replace(sou, var, val);
end;
val in varchar2, --На что заменяется
sou in clob --Источник замены
) return clob as
begin
--return replace(sou, var, convert(val, 'UTF8', 'CL8MSWIN1251'));
return replace(sou, var, val);
end;
_____________________________
Для вывода я создавала параллельную программу, с исполняемым файлом - процедурой из пакета. При отработке запроса в файле результатов формируется xml документ и ОЕБС автоматически открывает его в Excel, таким образом получая нужный нам вид отчета.
Этот комментарий был удален автором.
ОтветитьУдалить