2011-03-15 61 views
8

我正在自動執行一些需要很長時間的excel相關任務。如何強制python(使用win32com)創建一個新的excel實例?

我創建使用Excel實例:

excel = win32.gencache.EnsureDispatch('Excel.Application') 
wb = excel.Workbooks.Add() 

然而,腳本開始運行時,如果我選擇一個開放的Excel工作簿(不是一個蟒蛇正在)後,Python腳本崩潰。但是,如果我打開一個新的Excel工作簿並在其中輸入東西,python腳本不受影響。

有沒有一種特殊的方式可以調用excel來防止這種情況發生?或者其他解決方案?

編輯:這似乎工作。

excel = win32.DispatchEx('Excel.Application') 
+0

它不會傷害,如果你還要提到以防萬一,你使用哪些版本。 – 2011-03-15 10:30:27

+0

Office 2007,python 2.7 – jck 2011-03-15 10:31:45

+0

那麼問題的情況是什麼?你找到答案了嗎?請告訴我們。 – 2012-01-11 16:18:16

回答

1

你爲什麼不這樣做呢?

from win32com import client 
excel=client.Dispatch("Excel.Application") 
+3

如果您不運行make.py來生成「靜態com代理」,則需要'EnsureDispatch'來訪問'win32com.constants'。看到這個鏈接:http://timgolden.me.uk/python/win32_how_do_i/generate-a-static-com-proxy.html 此外,'Dispatch'不能解決他的問題,解決方案是'DispatchEx() ' – Symmitchry 2013-03-22 23:33:14

0

下面是創建一個新實例的方式使用靜態緩存(這是更快,並給出使用kwargs的能力):

from win32com.client import gencache 
import pythoncom 

clsid = "Word.Application" 
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() 
olApp = gencache.EnsureDispatch(clsid) 
相關問題