win32com打开和发送excel进程之间的交互

时间:2014-03-25 00:13:31

标签: python 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')

然后我对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文件 一个。编辑打开的文件时脚本将崩溃。 湾执行这些代码行时,open 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文件?

1 个答案:

答案 0 :(得分:0)

您应该设计脚本,假设只能运行一个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()