簡體   English   中英

如何強制python(使用win32com)創建excel的新實例?

[英]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.

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