Python Win32 COM模块问题
我想将.xls转换为.xlsx,所以我使用win32com模块 这是我的代码: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
导入操作系统
将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成功!!')