【问题标题】:Python - Converting XLSX to PDFPython - 将 XLSX 转换为 PDF
【发布时间】:2019-02-18 23:03:16
【问题描述】:

我一直在我的开发服务器中使用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)

在 Python 中从 xlsx 转换为 PDF 有什么好的替代方法吗?

我已经使用 PDFWriter 测试了 xtopdf,但是使用此解决方案,您需要读取和迭代范围并逐行写入。不知有没有类似win32com.client的更直接的解决方案。

谢谢!

【问题讨论】:

  • 不是,例外不同。顺便说一句,那个帖子还没有解决。
  • 是的……你有一个可移植性问题,并且该线程列出了将 xlsx 转换为 pdf 的所有可行选项。顺便说一句,OP 回答了他们自己的问题。
  • 是的,他使用了对我不起作用的相同解决方案。因为这不是同一个问题,所以我打开了一个新线程。
  • 也与convert excel to pdf in python非常相关。

标签: python django pdf xlsx win32com


【解决方案1】:

由于我原来的answer 已被删除并且最终有点用处,所以我在这里重新发布它。

您可以分 3 步完成:

  1. excel 到熊猫:pandas.read_excel
  2. 熊猫转 HTML:pandas.DataFrame.to_html
  3. HTML 转 pdf:python-pdfkit (git), python-pdfkit (pypi.org)
import pandas as pd
import pdfkit

df = pd.read_excel("file.xlsx")
df.to_html("file.html")
pdfkit.from_file("file.html", "file.pdf")

安装:

sudo pip3.6 install pandas xlrd pdfkit
sudo apt-get install wkhtmltopdf 

【讨论】:

  • 这非常有用。是否可以在 Windows 中执行此操作。?如何在 windows 中安装 wkhtmltopdf?
  • 这是否适用于包含图像、公式和格式的 Excel 文件?
【解决方案2】:
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()

我一直在用这个,效果很好

【讨论】:

  • 是的,我已经测试过了,它工作正常。问题是您需要迭代范围以在 PDF 中写入行。我正在寻找与win32com 等效的解决方案,您可以在其中选择要导出的工作表。
  • PDFWriter 库还存在吗?
  • 有人知道如何安装这个PDFWriter吗?我找不到任何链接。 pdfrw 是同一个模块吗?
  • @ArindamRoychowdhury bitbucket.org/vasudevram/xtopdf/downloads 下载 repo 及其在其中,但我仍然无法继续...
  • @ArindamRoychowdhury 很好,我最终使用了 Pandas,read_excel(),然后将数据帧转换为 HTML,然后使用 imgkit 将 html 表转换为 PNG
【解决方案3】:

编辑:感谢您的反对,但这是一种比尝试加载难以找到且在 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 文件即时转换并在我的应用程序上显示为图像缩略图。

【讨论】:

  • 如果在答案中发布代码,您应该包含导入。
猜你喜欢
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2013-07-15
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多