Я пришел к, скажем, не очень красивому, но редкому решению, которое работает очень гибко для меня.
- Используйте 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.