如何使用 Python Azure Webjob 将 xls 转换为 xlsx

How to convert xls to xlsx with Python Azure Webjob

我需要能够使用 Python 和 运行 脚本将 xls 转换为 xlsx 文件作为 Azure Webjob。 我可以使用以下代码在本地计算机上完成这项工作:

import win32com.client as win32
import os

def xls_2_xlsx(xls_path, xlsx_path):
    # Create temp xlsx-File
    if os.path.exists(xlsx_path): os.remove(xlsx_path)

    excel = win32.DispatchEx("Excel.Application")
    excel.Visible = 0
    wb = excel.Workbooks.Open(xls_path)

    wb.SaveAs(xlsx_path, FileFormat = 51)    #FileFormat = 51 is for .xlsx extension
    wb.Close()  

当 运行将代码作为 Azure Webjob 时,我收到以下错误:

pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)

可能是因为在 Azure Webjob 机器上(显然)没有安装 Excel。

我尝试了其他方法来转换文件,如下所述: how to convert xls to xlsx

不幸的是,某些 xls 文件的单元格值以“+”号开头,并被解释为公式,这会导致错误。逐个单元格转换 xls 文件时,这些单元格的实际值会丢失。

任何帮助 python 作为 Azure WebJob 完成此任务的人都将不胜感激。

在 Windows 的 Azure WebApps 上,由于有一个名为 Azure Web App Sandbox 的安全环境,它将限制许多操作,包括 Win32k.sys (User32/GDI32) Restrictions。因此,您不能通过 win32com 调用任何导致问题的 COM 组件。

在纯Python中,xlsxlsx的方法有很多,比如下面常见的两种。

  1. 通过 pip install pyexcel pyexcel-xls pyexcel-xlsx 安装 pyexcel 即可。

    import pyexcel as p
    
    p.save_book_as(file_name='<your input file>.xls', dest_file_name='<your output file>.xlsx')
    
  2. 通过 pip install pandas 安装 pandas 即可。

    import pandas as pd
    
    dataFrame = pd.read_excel('<your input file>.xls')
    dataFrame.to_excel('<your output file>.xlsx', index=False)
    

注意:以上两种解决方案只能转换这些xls常见数据类型的文件,如字符串,数字,内容不丰富(图表或图像等)

如果您想通过 win32comExcel.Application 转换内容丰富或没有任何格式更改的 xls 文件,您必须使用 Azure Windows VM 来运行 您的脚本并与您的 WebApp 集成。