[[ Экспорт запросов PostgreSQL в Excel файл ]]

PostgreSQLMicrosoft Excel

Экспорт запросов PostgreSQL в Excel файл

python3.x
python3-psycopg2
python3-xlsxwriter

Данная утилита сохраняет результаты SQL запросов к СУБД PostgreSQL в файл .xlsx.
Можно применять для создания: отчетов и т.п.
Каждый запрос сохраняется на отдельной странницы документа.


Установка скрипта

Сам скрипт размещен на GitHub


Настройка

Для начала работы необходимо настроить config.ini
Файл состоит из специальной секции default и секций страниц

[default]
output = /tmp/1.xlsx
overwrite = on
;font_name = Liberation Sans
;font_size = 10
 
host = 127.0.0.1
port = 5432
base = [BASE]
user = [USER]
pass = [****]
 
 
[Тест]
query = SELECT 1 as test;
 
[Пользователи]
query = SELECT
         "public".users.userid,
         "public".users."name",
         "public".users.surname
        FROM
         "public".users
        WHERE
         "public".users."name" NOT LIKE 'A';
 
[Из другой базы]
host = 10.0.0.1
port = 5432
base = [BASE]
user = [USER]
pass = [****]
query = select ...;
 
[Несколько запросов]
; Разделитель ';\n'.
query = SELECT NULL as "Title text" limit 0;
        SELECT 0.1 as money, 'Alex' as "Test Name";
        SELECT NULL limit 0;
        SELECT NULL limit 0;
        SELECT NULL as "Other subject  title" limit 0;
        SELECT 11 as minute,  5 as second;


Исполнение

user@localhost:~$ ./psql2xlsx.py -h
user@localhost:~$ ./psql2xlsx.py
[..] Generated page :: Тест ...
[OK] PostgreSQL successfully connected
[..] Generated page :: Пользователи ...
[OK] PostgreSQL successfully connected
[..] Generated page :: Из другой базы ...
[OK] PostgreSQL successfully connected
[OK] Workbook saved :: /tmp/1.xlsx


Автоматизация

Создадим скрипт работающий по cron'y и отправляющий файл на почту.

#!/bin/bash
XLSX_FILE="/tmp/1.xlsx"
 
rm -f "${XLSX_FILE}"
 
STDOUT=$(/opt/psql2xlsx/psql2xlsx.py --output "${XLSX_FILE}" 2>&1)
 
if [ ! -f "${XLSX_FILE}" ]; then
    echo "ERROR" > "${XLSX_FILE}"
fi
 
sendemail -f test@domain.com -u "AutoOt4et" \
          -m "${STDOUT}" -o message-charset=utf-8 -a "${XLSX_FILE}" \
          -s smtp.mail.com:587 -xu 'LoGiN' -xp 'PaSsWorD' \
          -t alexey@domain.ru

В этом примере я использую утилиту sendemail. К сожалению в текущей версии у нее нет правильного mime-type для вложений .xlsx
Это может доставить небольшие неприятности при открытии документа из почтового клиента, но легко поправимо:

    elsif ($encoding =~ /mdb|mda|mde/i) {                          $content_type = 'application/vnd.ms-access';       }
+   elsif ($encoding =~ /xlsx/i)                            {      $content_type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';}
    elsif ($encoding =~ /xls|xlt|xlm|xld|xla|xlc|xlw|xll/i) {      $content_type = 'application/vnd.ms-excel';        }






Обсуждение

Haowu Ge, 2019/08/13 10:42

Здравствуйте, если количество строк данных превышает 1048576 строк, как я могу автоматически добавить лист? Hello, if the number of data lines exceeds 1048576 lines, how can I automatically add a sheet? 您好,如果数据行数超过1048576行,如何让他自动新增一个sheet?

Haowu Ge, 2019/08/13 12:09

Здравствуйте, я хочу установить числовой формат, но, похоже, он не вступил в силу Workbook_format_global.set_num_format ('0.00') не вступает в силу workbook_format_global.set_num_format (0.00) частично действителен, неправильный формат

Hello, I want to set the number format but it doesn't seem to take effect Workbook_format_global.set_num_format('0.00') does not take effect workbook_format_global.set_num_format(0.00) partially valid, format is incorrect

您好,我想设置数字格式但是似乎并不生效 workbook_format_global.set_num_format('0.00') 不生效 workbook_format_global.set_num_format(0.00) 部分生效,结果不正确

Haowu Ge, 2019/08/13 12:11

Не удается отправить фотографии, они должны были содержать 2 десятичных знака, последние два не отображаются

Can't send pictures, it should have kept 2 decimals, the last two don't show

Показать результаты: 111.66 → 112

Haowu Ge, 2019/08/14 12:11

Спасибо за вашу работу, Я решил проблему с format.num_format_index

Евгений, 2021/07/22 12:27

Здравствуйте, мне выдает ошибку "Missing configuration section :: default" Хотя она есть и настроена. Попытался разобраться в вашем коде, не нашёл, как это исправить

Ваш комментарий. Вики-синтаксис разрешён:
144 +4 =​
 
handmade/postgres/psql2xlsx.txt · Последнее изменение: 127.0.0.1
Gentoo Linux Gentoo Linux Driven by DokuWiki