我想把.xls转换成.xlsx,所以我使用win32com模块
这是我的密码:
import os
import win32com.client as win32
address = address = os.getcwd()
fname = address + "\\Bundles.xls"
fname2 = address + "\\searchresults.xls"
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel2 = win32.gencache.EnsureDispatch('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 is for .xlsx extension
wb.Close()
wb5.Close() #FileFormat = 56 is for .xls extension
excel.Application.Quit()
excel2.Application.Quit()
print('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'发布于 2020-06-21 18:50:14
看起来,您遇到了一个bug,当您将early binding与win32com一起使用时,就会发生这种情况。我的建议是,如果您可以使用late binding,因为您不会收到错误。如果您确实需要使用early binding,那么您可以从win32com中删除自动生成的python代码。如果您在系统上访问此位置:
C:\Users\<USERNAME>\AppData\Local\Temp\gen_py您将在其中看到一些文件夹,其中每个文件夹表示生成代码的python版本。例如,如果您看到3.7,这意味着python 3.7。不管您看到的是哪个文件,您都应该看到一堆不同的python文件。其中,每个文件表示指定early binding的不同对象。您所需要做的就是删除3.7文件夹或其他什么,然后重新运行您的代码。这在90%的时间里解决了这个问题。
现在使用您的代码,我建议您稍微修改它,因为您实际上不需要同时打开两个Excel实例。
import os
import win32com.client as win32
address = address = os.getcwd()
file_name_1 = address + "\\Bundles.xls"
file_name_2 = address + "\\searchresults.xls"
new_file_name_1 = file_name_1 + "_converted"
new_file_name_2 = file_name_2 + "_converted"
excel = win32.gencache.EnsureDispatch('Excel.Application')
file_1 = excel.Workbooks.Open(file_name_1)
file_2 = excel.Workbooks.Open(file_name_2)
file_1.SaveAs(new_file_name_1, FileFormat = 51)
file_2.SaveAs(new_file_name_2, FileFormat = 51)
file_1.Close()
file_2.Close()
excel.Application.Quit()
print('File .xls convert .xlsx successfully!!')https://stackoverflow.com/questions/59276808
复制相似问题