首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Win32com模问题

Win32com模问题
EN

Stack Overflow用户
提问于 2019-12-10 23:25:33
回答 1查看 1.3K关注 0票数 0

我想把.xls转换成.xlsx,所以我使用win32com模块

这是我的密码:

代码语言:javascript
复制
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!!')

然后我得到了错误,这里是回溯:

代码语言:javascript
复制
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'
EN

回答 1

Stack Overflow用户

发布于 2020-06-21 18:50:14

看起来,您遇到了一个bug,当您将early bindingwin32com一起使用时,就会发生这种情况。我的建议是,如果您可以使用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实例。

代码语言:javascript
复制
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!!')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59276808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档