Python Win32 COM模块问题

Python Win32 COM模块问题,python,excel,python-3.x,Python,Excel,Python 3.x,我想将.xls转换为.xlsx,所以我使用win32com模块 这是我的代码: 导入操作系统 将win32com.client作为win32导入 address=address=os.getcwd() fname=地址+“\\Bundles.xls” fname2=地址+“\\searchresults.xls” excel=win32.gencache.EnsureDispatch('excel.Application') excel2=win32.gencache.EnsureRedispa

我想将.xls转换为.xlsx,所以我使用win32com模块

这是我的代码:

导入操作系统
将win32com.client作为win32导入
address=address=os.getcwd()
fname=地址+“\\Bundles.xls”
fname2=地址+“\\searchresults.xls”
excel=win32.gencache.EnsureDispatch('excel.Application')
excel2=win32.gencache.EnsureRedispatch('Excel.Application')
wb=excel.Workbooks.Open(fname)
wb5=excel.Workbooks.Open(fname2)
wb.SaveAs(fname+“x”,FileFormat=51)
wb5.SaveAs(fname2+“x”,FileFormat=51)#FileFormat=51表示.xlsx扩展名
wb.Close()
wb5.Close()#FileFormat=56表示.xls扩展名
excel.Application.Quit()
excel2.Application.Quit()
打印('File.xls convert.xlsx successful!!')
然后我得到了错误,这是回溯:

Traceback (most recent call last):
  File "c:/Users/shenshuaic/Desktop/SFP Program/win32test.py", line 7, in <module>
    excel = win32.gencache.EnsureDispatch('Excel.Application')
  File "C:\Users\shenshuaic\AppData\Roaming\Python\Python37\site-packages\win32com\client\gencache.py", line 527, in EnsureDispatch
    disp = win32com.client.Dispatch(prog_id)
  File "C:\Users\shenshuaic\AppData\Roaming\Python\Python37\site-packages\win32com\client\__init__.py", line 96, in Dispatch
    return __WrapDispatch(dispatch, userName, resultCLSID, typeinfo, clsctx=clsctx)
  File "C:\Users\shenshuaic\AppData\Roaming\Python\Python37\site-packages\win32com\client\__init__.py", line 37, in __WrapDispatch
    klass = gencache.GetClassForCLSID(resultCLSID)
  File "C:\Users\shenshuaic\AppData\Roaming\Python\Python37\site-packages\win32com\client\gencache.py", line 183, in GetClassForCLSID
    mod = GetModuleForCLSID(clsid)
  File "C:\Users\shenshuaic\AppData\Roaming\Python\Python37\site-packages\win32com\client\gencache.py", line 226, in GetModuleForCLSID
    mod = GetModuleForTypelib(typelibCLSID, lcid, major, minor)
  File "C:\Users\shenshuaic\AppData\Roaming\Python\Python37\site-packages\win32com\client\gencache.py", line 266, in GetModuleForTypelib
    AddModuleToCache(typelibCLSID, lcid, major, minor)
  File "C:\Users\shenshuaic\AppData\Roaming\Python\Python37\site-packages\win32com\client\gencache.py", line 552, in AddModuleToCache
    dict = mod.CLSIDToClassMap
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9' has no attribute 'CLSIDToClassMap'
回溯(最近一次呼叫最后一次):
文件“c:/Users/shenshuaic/Desktop/SFP Program/win32test.py”,第7行,在
excel=win32.gencache.EnsureDispatch('excel.Application')
文件“C:\Users\shenshuaic\AppData\Roaming\Python37\site packages\win32com\client\gencache.py”,第527行,位于修补程序中
disp=win32com.client.Dispatch(程序id)
文件“C:\Users\shenshuaic\AppData\Roaming\Python37\site packages\win32com\client\\uuuuu init\uuuuu.py”,第96行,在分派中
return uu WrapDispatch(分派、用户名、resultcsid、typeinfo、clsctx=clsctx)
文件“C:\Users\shenshuaic\AppData\Roaming\Python\37\site packages\win32com\client\ \uuuuuu init\uuuuuuuuu.py”,第37行,在\uuuuu WrapDispatch中
klass=gencache.GetClassForCLSID(resultcsid)
文件“C:\Users\shenshuaic\AppData\Roaming\Python37\site packages\win32com\client\gencache.py”,第183行,位于GetClassForCLSID中
mod=getModuleForcsid(clsid)
文件“C:\Users\shenshuaic\AppData\Roaming\Python37\site packages\win32com\client\gencache.py”,第226行,位于GetModuleForcSID中
mod=GetModuleForTypelib(typelibCLSID、lcid、major、minor)
文件“C:\Users\shenshuaic\AppData\Roaming\Python37\site packages\win32com\client\gencache.py”,第266行,位于GetModuleForTypelib中
AddModuleToCache(类型libclsid、lcid、主要、次要)
文件“C:\Users\shenshuaic\AppData\Roaming\Python37\site packages\win32com\client\gencache.py”,第552行,位于AddModuleToCache中
dict=mod.CLSIDToClassMap
AttributeError:模块“win32com.gen_py.00020813-0000-0000-C000-0000000000 46x0x1x9”没有属性“CLSIDToClassMap”

看起来您遇到了一个bug,当您使用
早期绑定
win32com
时会发生这个bug。我的建议是,如果您可以使用
后期绑定
,因为您不会收到错误。如果确实需要使用
早期绑定
,则需要从
win32com
中删除自动生成的python代码。如果您在系统上转到此位置:

  • C:\Users\\AppData\Local\Temp\gen\u py
您将在其中看到一些文件夹,其中每个文件夹表示生成代码的python版本。例如,如果您看到
3.7
,这意味着
python3.7
。不管你看到哪一个,你都应该看到一堆不同的python文件。其中,每个文件表示您为其指定的不同对象。 您只需删除
3.7
文件夹或其他任何文件夹,然后重新运行代码。这解决了90%的问题

现在,对于您的代码,我建议您稍微修改一下,因为您确实不需要同时打开两个Excel实例

导入操作系统
将win32com.client作为win32导入
address=address=os.getcwd()
文件名=地址+“\\Bundles.xls”
文件名=地址+“\\searchresults.xls”
新建文件名1=文件名1+“\u已转换”
新建文件名=文件名+已转换
excel=win32.gencache.EnsureDispatch('excel.Application')
file_1=excel.Workbooks.Open(文件名_1)
file_2=excel.Workbooks.Open(文件名_2)
文件\ 1.SaveAs(新文件\名称\ 1,文件格式=51)
文件2.SaveAs(新文件名2,文件格式=51)
文件_1.Close()
文件_2.Close()
excel.Application.Quit()
打印('File.xls convert.xlsx成功!!')