簡體   English   中英

開放式和調度式Excel流程,Win32com之間的交互

[英]Interaction between open and dispatched excel processes, win32com

我正在使用win32com(LiClipse中的Python 2.7(Anaconda))啟動Excel的單獨實例...

class ExcelDocument(object):
    """Excel class
    """
    def __init__(self, xlDocIn, make_visible=False):
        """Open spreadsheet"""
        self.excelApp = DispatchEx('Excel.Application')

然后,我對Excel文檔(使用MS Office 2013)做點點滴滴,包括使用DispatchEx打開另一個文檔...

objExcel1 = ExcelDocument(PATH_TABLE,False)
objExcel1.update_sheets()
...
objExcel2 = ExcelDocument(PATH_BACKG, False)

嘗試分配第二個ExceLDocument類將使腳本崩潰。

如果我將init更改為

def __init__(self, xlDocIn, make_visible=False):
        """Open spreadsheet"""
        try:
            self.excelApp = GetActiveObject('Excel.Application')
        except:
            self.excelApp = DispatchEx('Excel.Application')

腳本運行正常。

如果我在運行腳本時打開了一個excel文件,要么。 該腳本將在編輯打開的文件時崩潰。 當執行這些代碼行時,打開的excel文件將關閉...

def close(self):
        """Close spreadsheet resources"""
        self.excelApp.DisplayAlerts = True
        self.workbook.Saved = 0
        self.workbook.Close(SaveChanges=0)
        self.excelApp.Visible = 0

我不能第二次調用DispatchEx是有原因的,因為我的腳本應在后台運行並且不中斷任何打開的Excel文件?

盡管腳本可以包含多個工作簿,但是您應該設計腳本,前提是只能運行一個Excel實例。 如果使用GetObject (而不是GetActiveObject ),則win32com將向現有應用返回一個句柄(如果存在),否則將啟動該應用。 因此,您將不需要if / else。

同樣,從設計的角度來說,這還意味着您應該有一種方法來跟蹤打開哪些工作簿 ,並僅關閉那些工作簿 ,以使Excel應用程序的最終狀態與啟動腳本時相同。 因此,每個工作簿將有一個ExcelDocument實例,每個實例都使用GetObject ,並且每個實例都關閉它代表的工作簿。 在創建第一個ExcelDocument之前,請保存GetActiveObject以便您的腳本知道是否應在退出時關閉應用程序。

基本上:

activeXlApp = win32com.client.GetActiveObject('Excel.Application') 

objExcel1 = ExcelDocument(PATH_TABLE,False) # uses GetObject()
objExcel1.update_sheets()
...
objExcel2 = ExcelDocument(PATH_BACKG, False)

if activeXlApp is not None: 
    activeXlApp.Close()

暫無
暫無

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

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