我尝试使用 win32com 将多个 xlsx 文件转换为 xls,代码如下:
import win32com.client
f = r"./input.xlsx"
xl = win32com.client.gencache.EnsureDispatch('Excel.Application')
wb = xl.Workbooks.Open(f)
xl.ActiveWorkbook.SaveAs("./somefile.xls", FileFormat=56)
由于以下错误而失败:
Traceback (most recent call last):
File "xlsx_conv.py", line 6, in <module>
xl.ActiveWorkbook.SaveAs("./somefile.xls", FileFormat=56)
File "C:\python27\lib\site-packages\win32com\gen_py\00020813-0000-0000-C000-000000000046x0x1x9.py", line 46413, in SaveAs
, Local, WorkIdentity)
pywintypes.com_error: (-2147352562, 'Invalid number of parameters.', None, None)
更多细节:
我可以对工作簿执行其他命令,即 wb.Worksheets.Add()
并设置 xl.Visible=True
来查看工作簿。甚至可以执行 wb.Save()
但无法执行 wb.SaveAs()
最佳答案
COM 异常是由于缺少文件名参数造成的,因为找不到 f = r"./input.xlsx"
。如果您使用 Excel 2013+,您会收到更精确的异常消息,其中错误代码略有不同:
(-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', "Sorry, we couldn't find ./input.xlsx. Is it possible it was moved, renamed or deleted?", 'xlmain11.chm', 0, -2146827284), None)
虽然您的路径确实在 Python 的 native 上下文中工作,指向被调用的 .py 脚本所在的目录,但它在与外部 API(如 Windows COM)的接口(interface)中不起作用,因为需要完整路径。
要解决这个问题,请考虑使用 Python 内置的 os 来提取脚本的当前目录路径,并与 Excel COM 方法中的 os.path.join() 相连接。另外,下面使用 try/except/finally
在后台正确结束 Excel.exe 进程,无论是否引发异常。
import os
import win32com.client as win32
cd = os.path.dirname(os.path.abspath(__file__))
try:
f = os.path.join(cd, "input.xlsx")
xl = win32.gencache.EnsureDispatch('Excel.Application')
wb = xl.Workbooks.Open(f)
xl.ActiveWorkbook.SaveAs(os.path.join(cd, "input.xls"), FileFormat=56)
wb.Close(True)
except Exception as e:
print(e)
finally:
wb = None
xl = None
关于Python win32com 'Invalid number of parameters',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40995672/