Простые отчеты в формате Excel из базы данных Oracle
Эта статья может быть полезна тем, кто должен автоматически создавать множество отчетов из БД в формате Excel-файлов.Возможные способы формирования
Иногда возникает задача автоматически отправлять произвольные выгрузки из базы данных обычным пользователям, которые привыкли работать с Excel и WordЕсть несколько вариантов реализации создание отчетов:
- Можно сформировать текстовый файл в формате csv c помощью sqlplus, например так:
 - Сформировать текстовый файл в формате html c помощью sqlplus
 - Сформировать реальный Excel-файл. Плюсом является возможность расширенного форматирования и отсутствие проблем с кодировками. Файл можно сформировать с помощью PL/SQL или perl/python - скриптов.
 
  
set linesize 9999
set pagesize 50000
spool myfile.csv
select x
from
(
select col1||';'||col2||';'||col3||';'||col4||';'||col5||';'||col6||';'||col7||';'||col8||';'||col9||';'||col10||';'||col11||';'||col12||';'||col13||';'||col14||';'||col15||';'||col16||';'||col17||';'||col18||';'||col19||';'||col20||';'||col21||';'||col22||';'||col23||';'||col24||';'||col25||';'||col26||';'||col27||';'||col28||';'||col29||';'||col30 as x
from (  
      
     )
);
spool off
При форматировании файлов на Unix-сервере возможны проблемы с русскими буквами, также иногда не корректно открываются файлы из-за разных настроек разделителей в excel у пользователя.
При формировании файлов на Windows-сервере можно сразу конвертировать созданные csv-файлы в excel-формат с помощью VB-скриптов, наподобие такого:
Private Sub ap_WorkbookOpen(ByVal Wb As Workbook)
    With Wb
    If InStrRev(.Name, ".csv") = Len(.Name) - 3 Then
    .SaveAs Filename:=Left(.FullName, Len(.FullName) - 4) + ".xls", _
        FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False
    .Close
    End If
    End With
End Sub      
  
SET PAGESIZE 50000
SET FEED OFF MARKUP HTML ON SPOOL ON
SET NUM 24
SPOOL DATA_2.xls
SELECT * FROM xxx;
SPOOL OFF
SET MARKUP HTML OFF SPOOL OFF
       
 
В этом случае проблем с кодировками нет, но пользователь при открытии файла получит сообщение:
- C помощью PL/SQL создание excel-файлов выглядит примерно так:
 
  
    UTL_FILE.PUT_LINE(v_fh,'');
    FOR j in 1..col_cnt
    LOOP
      UTL_FILE.PUT_LINE(v_fh,'');
      UTL_FILE.PUT_LINE(v_fh,''||rec_tab(j).col_name||' ');
      UTL_FILE.PUT_LINE(v_fh,' ');
    END LOOP;
    UTL_FILE.PUT_LINE(v_fh,' ');
       
 
Формирование отчетов с помощью Python
В Python доступно несколько модулей по работе с Excel: xlrd, xlwt, xlutils, XlsxWriter или openpyxl . Модуль XlsxWriter идеален для тех кто создает отчеты с нуля, openpyxl удобен тем, что можно открыть существующий файл и добавить в него данные.Вариант работы с openpyxl выглядит так:
- в Excel предварительно создаем шаблон отчета, выбираем оформление, заполняем шапку, названия колонок и т.д.;
 - создаем конфигурационный файл, с параметрами подключения к базе, с ссылкой на sql-файл, названием отчета и т.д.
 - запускаем Python-скрипт, на вход подаем название конфигурационного файла и название excel-файла, скрипт считывает кофигурационный файл, подключается к указанной БД, выполняет указанный SQL-запрос, и заполняет excel данными из БД
 - внутри python-скрипт выполняет запрос к базе данных, открывает существующий excel-файл и заполняет excel-файл данными;
 
В коде Python- скрипта это выглядит примерно так:
  
    wb = openpyxl.load_workbook(filename=excel_file)
    try:
        ws = wb[excel_page]  
    except Exception as e:
        logger.error( ... )
    row = first_row
    for tupple_row in cur_sor:
        col = first_col
        for list_item in tupple_row:
            ws.cell(row=row, column=col, value=list_item)
            col = col + 1
        row = row + 1
    wb.save(excel_file)
       
 
https://github.com/sbrazgin/SBReporter
Обновление Python
В случае установки последней версии Python и необходимые модули на Linux-сервер, на котором нет доступа к интернету придется вручную скопировать. После установке необходимо будет дополнительно установить модули cx_Oracle и openpyxl.Инструкция по установке:
- Создаем каталог для установки
 - Копируем в него и распаковываем дистрибутив Python
 - Компилируем Python
 - Устанавливаем расширения
 - Копируем пакеты на сервер: et-xmlfile jdcal openpyxl
 - Распаковываем:
 - Устанавливаем:
 
mkdir /opt/Python
cd /opt/Python
gunzip Python-3.6.5.tgz
tar xf Python-3.6.5.tar
cd Python-3.6.5
./configure
make
make install
tar -xvzf jdcal-1.4.tar.gz
tar -xvzf et_xmlfile-1.0.1.tar.gz
tar -xvzf openpyxl-2.5.3.tar.gz
cd jdcal-1.4
python setup.py install
cd et_xmlfile-1.0.1
python setup.py install
cd openpyxl-2.5.3
python setup.py install

Комментариев нет:
Отправить комментарий