![](/img/trans.png)
[英]How can I retrieve an Excel IRibbonUI instance in Python using win32com?
[英]How can I force python(using win32com) to create a new instance of excel?
我正在自動化一些需要很長時間的 excel 相關任務。
我正在使用以下方法創建一個 excel 實例:
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Add()
但是,在腳本開始運行后,如果我選擇一個打開的 excel 工作簿(不是 Python 正在處理的工作簿),則 Python 腳本會崩潰。 但是,如果我打開一個新的 excel 工作簿並在其中輸入內容,python 腳本不受影響。
有沒有一種特殊的方法可以調用 excel 來防止這種情況發生? 還是有其他解決辦法?
編輯:這似乎有效。
excel = win32.DispatchEx('Excel.Application')
這是一種創建新實例並使用靜態緩存的方法(它更快並且能夠使用 kwargs):
import sys
import shutil
import pythoncom
from win32com.client import gencache
def EnsureDispatchEx(clsid, new_instance=True):
"""Create a new COM instance and ensure cache is built,
unset read-only gencache flag"""
if new_instance:
clsid = pythoncom.CoCreateInstanceEx(clsid, None, pythoncom.CLSCTX_SERVER,
None, (pythoncom.IID_IDispatch,))[0]
if gencache.is_readonly:
#fix for "freezed" app: py2exe.org/index.cgi/UsingEnsureDispatch
gencache.is_readonly = False
gencache.Rebuild()
try:
return gencache.EnsureDispatch(clsid)
except (KeyError, AttributeError): # no attribute 'CLSIDToClassMap'
# something went wrong, reset cache
shutil.rmtree(gencache.GetGeneratePath())
for i in [i for i in sys.modules if i.startswith("win32com.gen_py.")]:
del sys.modules[i]
return gencache.EnsureDispatch(clsid)
wdApp = EnsureDispatchEx("Word.Application")
更新:改進版本會在出錯時重置緩存
你為什么不這樣做呢?
from win32com import client
excel=client.Dispatch("Excel.Application")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.