Python-将XLSX转换为PDF

时间:2018-09-14 07:17:03

标签: python django pdf xlsx win32com

我一直在开发服务器中使用CULL_FREQUENCY模块来轻松地从MAX_ENTRIES转换为win32com

xlsx

但是,我已经将pdf应用程序部署到了没有安装Excel应用程序的生产服务器中,并且引发了以下错误:

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()

在Python中是否有从DjangoFile "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) 转换的好选择?

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

谢谢!

3 个答案:

答案 0 :(得分:5)

由于我的原始answer已被删除并最终变得很有用,因此我在此处重新发布。

您可以通过3个步骤进行操作:

  1. 擅长熊猫: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 

答案 1 :(得分:1)

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()

我一直在使用它,并且效果很好

答案 2 :(得分:1)

编辑:感谢您的不赞成投票,但这是一种比试图加载一个很难找到的冗余脚本更有效的方法,该脚本在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文件并在应用程序中显示为图像缩略图。