开放和调度的excel进程之间的相互作用,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') 

然后,我做点和bobs到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文件将会closures。

 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实例,您应该devise脚本,尽pipe它可以包含多个工作簿。 如果您使用GetObject (而不是GetActiveObject ),那么win32com将返回一个现有应用程序的句柄(如果存在),或者如果不存在,则启动该应用程序。 所以你不需要if / else。

另外,这在devise方面意味着您应该有一种方法来跟踪哪些工作簿被打开,并且只closures这些工作簿 ,以便Excel应用程序的最终状态与启动脚本时的状态相同。 因此,每个工作簿都有一个ExcelDocument实例,每个实例都使用GetObject ,每个实例closures它所代表的工作簿。 在创build第一个ExcelDocument之前,请保存GetActiveObject ,让脚本知道它是否应该退出时closures应用程序。

基本上:

 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()