簡體   English   中英

Win32com 模塊問題

[英]Win32com Module Problems

我想將 .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'

看起來您遇到了一個錯誤,當您將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 實例。

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!!')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM