Python - Преобразование XLSX в PDF - PullRequest
0 голосов
/ 14 сентября 2018

Я всегда использовал модуль win32com на своем сервере разработки для простого преобразования из xlsx в pdf:

o = win32com.client.Dispatch("Excel.Application")
o.Visible = False
o.DisplayAlerts = False
wb = o.Workbooks.Open("test.xlsx")))
wb.WorkSheets("sheet1").Select()
wb.ActiveSheet.ExportAsFixedFormat(0, "test.pdf")
o.Quit()

Однако я развернул свое приложение Django на производственном сервере, гдеУ меня не установлено приложение Excel, и возникает следующая ошибка:

File "C:\virtualenvs\structuraldb\lib\site-packages\win32com\client\__init__.p
y", line 95, in Dispatch
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,c
lsctx)
  File "C:\virtualenvs\structuraldb\lib\site-packages\win32com\client\dynamic.py
", line 114, in _GetGoodDispatchAndUserName
    return (_GetGoodDispatch(IDispatch, clsctx), userName)
  File "C:\virtualenvs\structuraldb\lib\site-packages\win32com\client\dynamic.py
", line 91, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.II
D_IDispatch)
com_error: (-2147221005, 'Invalid class string', None, None)

Есть ли хорошая альтернатива для преобразования из xlsx в PDF в Python?

У меня естьПротестировал xtopdf с PDFWriter, но с этим решением вам нужно читать и повторять диапазон и писать строки одну за другой.Интересно, есть ли более прямое решение, подобное win32com.client.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Edit: Спасибо за отрицательный голос, но это гораздо более эффективный метод, чем попытка загрузить избыточный скрипт, который трудно найти и который был написан в Python 2.7.

  1. Загрузка таблицы Excel в DataFrame
  2. Запись DataFrame в файл HTML
  3. Преобразование файла html в изображение.

    dirname, fname = os.path.split(source)
    basename = os.path.basename(fname)

    data = pd.read_excel(source).head(6)

    css = """

    """

    text_file = open(f"{basename}.html", "w")
    # write the CSS
    text_file.write(css)
    # write the HTML-ized Pandas DataFrame
    text_file.write(data.to_html())
    text_file.close()

    imgkitoptions = {"format": "jpg"}

    imgkit.from_file(f"{basename}.html", f'{basename}.png', options=imgkitoptions)

    try:
        os.remove(f'{basename}.html')
    except Exception as e:
        print(e)

    return send_from_directory('./', f'{basename}.png')

взято отсюда https://medium.com/@andy.lane/convert-pandas-dataframes-to-images-using-imgkit-5da7e5108d55

Работает очень хорошо, у меня есть файлы XLSX, конвертируемые на лету и отображаемые в виде эскизов изображений в моем приложении.

0 голосов
/ 14 сентября 2018
from openpyxl import load_workbook
from PDFWriter import PDFWriter

workbook = load_workbook('fruits2.xlsx', guess_types=True, data_only=True)
worksheet = workbook.active

pw = PDFWriter('fruits2.pdf')
pw.setFont('Courier', 12)
pw.setHeader('XLSXtoPDF.py - convert XLSX data to PDF')
pw.setFooter('Generated using openpyxl and xtopdf')

ws_range = worksheet.iter_rows('A1:H13')
for row in ws_range:
    s = ''
    for cell in row:
        if cell.value is None:
            s += ' ' * 11
        else:
            s += str(cell.value).rjust(10) + ' '
    pw.writeLine(s)
pw.savePage()
pw.close()

Я использовал это, и он отлично работает

...