Python win32com 'Invalid number of parameters'

标签 python excel win32com

我尝试使用 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/

相关文章:

excel - 23 :59 VS 00:00 as start/end time

python - 导入错误 : cannot import name 'PandasError'

python - 如何将 scrapy.log 模块与自定义日志处理程序一起使用?

python - Keras 密集层输入未展平

python - 从共享文件夹下载电子邮件附件 - Python

excel - 如何使用 Python 在 VBA 对话框上禁用或自动选择 'OK'(Application.DisplayAlerts = False 不起作用)

python - 使用 win32com 在 Outlook 中按对话线程对邮件进行分类/分组?

python - 在 python sympy 中求解符号方程组

excel - 为什么这只生成一对解决方案

当没有对象时,VBA for Excel 抛出 "Object variable or with block variable not set"