Экспорт запросов 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'; }
Обсуждение
Здравствуйте, если количество строк данных превышает 1048576 строк, как я могу автоматически добавить лист? Hello, if the number of data lines exceeds 1048576 lines, how can I automatically add a sheet? 您好,如果数据行数超过1048576行,如何让他自动新增一个sheet?
Здравствуйте, я хочу установить числовой формат, но, похоже, он не вступил в силу 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) 部分生效,结果不正确
Не удается отправить фотографии, они должны были содержать 2 десятичных знака, последние два не отображаются
Can't send pictures, it should have kept 2 decimals, the last two don't show
Показать результаты: 111.66 → 112
Спасибо за вашу работу, Я решил проблему с format.num_format_index
Здравствуйте, мне выдает ошибку "Missing configuration section :: default" Хотя она есть и настроена. Попытался разобраться в вашем коде, не нашёл, как это исправить