пятница, 19 октября 2012 г.

Создание шаблонов в формате Excel

Этот пост о том как создавать отчеты, выводящиеся в 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. В пакете производим вывод нужных частей

    /*  Сводный отчет */
  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;

__________________________

 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;



_____________________________


Для вывода я создавала параллельную программу, с исполняемым файлом - процедурой из пакета. При отработке запроса в файле результатов формируется xml документ и ОЕБС автоматически открывает его в Excel, таким образом получая нужный нам вид отчета.

1 комментарий: