Из веб-приложения Python: вставьте данные в электронную таблицу (например, LibreOffice / Excel), рассчитайте и сохраните в формате PDF - PullRequest
0 голосов
/ 22 октября 2018

Я столкнулся с проблемой: я хочу перенести данные (один большой массив данных и одно изображение) из моего веб-приложения на python (работающего на Tornado Webserver и Ubuntu) в электронную таблицу, рассчитать, сохранить в формате pdf и доставить ввнешний интерфейс.

Я рассмотрел несколько библиотек, таких как openpyxl для написания Sheets в MS Excel, но это решило бы только одну часть.Я думал об использовании LibreOffice и pyoo, но мне кажется, что мне нужна та же версия Python на моей бэкэнде, которая поставляется с LibeOffice при импорте pyuno.

Кто-то решил похожую проблему и есть рекомендации, как ее решить?это?

Спасибо

1 Ответ

0 голосов
/ 23 октября 2018

Я пришел к, скажем, не очень красивому, но редкому решению, которое работает очень гибко для меня.

  • Используйте openpyxl, чтобы открыть существующую книгу Excel, которая включает макет (Шаблон)
  • вставить фрейм данных в отдельный лист в этой рабочей книге
  • использовать openpyxl для сохранения в качестве временного_файла. Xlsx
  • вызвать LibeOffice с --headless --convert-to pdf временный_файл.xlsx

При выполнении последнего вызова все интегрированные формулы пересчитываются / обновляются и создается PDF-файл.

  • доставляет PDF во внешний интерфейс или обрабатывает, как вам нравится
  • удалить временный_файл.xlsx

import openpyxl
import pandas as pd
from subprocess import call

d   = {'col1': [1, 2], 'col2': [3, 4]}
df  = pd.DataFrame(data=d)
now = datetime.datetime.now().strftime("%Y%m%d_%H%M_%f")

wb_template_name = 'Template.xlsx'
wb_temp_name     = now + wb_template_name
wb               = openpyxl.load_workbook(wb_template_name)
ws               = wb['dataframe_sheet']
pdf_convert_cmd  = 'soffice --headless --convert-to pdf ' + wb_temp_name

for r in dataframe_to_rows(df, index=True, header=True):
   ws.append(r)
wb.save(wb_temp_name)
call(pdf_convert_cmd, shell=True)

Причина, по которой я это делаю, заключается в том, что я хотел бы иметь возможность стилизовать макетPDF независимо от данных.Я использую именованные диапазоны или поиски, которые ссылаются на отдельный лист данных в Excel.

Я еще не пробовал вставлять изображения, но это должно работать аналогично.Я думаю, что может быть способ повысить производительность, просто скопировав фрейм данных в файл xlsx (который является zip-файлом xmls), так что вам не нужен openpyxl.

...