Python win32com'参数数量无效'

时间:2016-12-06 12:41:35

标签: 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()

2 个答案:

答案 0 :(得分:1)

COM异常是由于缺少文件名参数,因为无法找到f = r"./input.xlsx"。如果你使用Excel 2013+,你会收到一个更精确的异常消息,错误代码略有不同:

  

( - 2147352567,'发生异常。',(0,'Microsoft Excel',“抱歉,我们   找不到./input.xlsx。有可能它被移动了,   重命名或删除?“,'xlmain11.chm',0,-2146827284),无)

虽然您的路径在指向被调用的.py脚本所在的目录的Python本机上下文中有效,但它不会与外部API(如Windows COM)连接,因为需要完整路径。

要解决此问题,请考虑使用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

答案 1 :(得分:1)

我花了很多时间寻找合适的解决方案,但我发现的唯一一件事就是我昨天写的脚本无效。此外,相同的脚本可以在其他计算机上运行,​​所以我想这在windows / MsExcel / Python环境中已经破坏了,但我无法弄清楚在哪里。

我找到了解决&#34; SaveAs&#34; 问题的工作,只是使用&#34; Save&#34; 功能。幸运的是,这仍然有效,并没有阻止我继续我的任务。我希望这有帮助。

import win32com.client as win32
from shutil import copyfile

# you need to define these two:
# src, is the absolute path to the excel file you want to open.
# dst, is the where you want to save as the file.

copyfile(src, dst)

excel   = win32.gencache.EnsureDispatch('Excel.Application')
wb      = excel.Workbooks.Open(PATH_DATASET_XLS)
ws      = wb.Worksheets(DATASET_WORKING_SHEET)

# do some stuff
ws.Cells( 1, 'A' ).Value = "hello" 

# Saving changes
wb.Save() # <- this is the work around
excel.Application.Quit()