web-dev-qa-db-fra.com

Python - Conversion de XLSX en PDF

J'ai toujours utilisé win32com module sur mon serveur de développement pour convertir facilement de xlsx en 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()

Cependant, j'ai déployé mon application Django sur le serveur de production où je n'ai pas d'application Excel installée et cela génère l'erreur suivante:

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)

Existe-t-il une bonne alternative pour convertir de xlsx en PDF en Python?

J'ai testé xtopdf avec PDFWriter, mais avec cette solution, vous devez lire et itérer la plage et écrire les lignes une par une. Je me demande s'il existe une solution plus directe similaire à win32com.client.

Merci!

6
DavidRguez

Edit: Merci pour le vote négatif, mais c'est une méthode beaucoup plus efficace que d'essayer de charger un script redondant difficile à trouver et écrit en Python 2.7.

  1. Charger une feuille de calcul Excel dans un DataFrame
  2. Écrivez le DataFrame dans un fichier HTML
  3. Convertissez le fichier html en une image.

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

Extrait d'ici https://medium.com/@andy.lane/convert-pandas-dataframes-to-images-using-imgkit-5da7e5108d55

Fonctionne très bien, j'ai des fichiers XLSX qui se convertissent à la volée et s'affichent sous forme de vignettes d'images sur mon application.

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

J'utilise ça et ça marche bien

0
thirteen4054