开放式和调度式excel进程之间的交互,win32com

2024-10-02 08:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用win32com(python2.7(Anaconda)在LiClipse中)来启动单独的excel实例。。。在

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

然后我对excel文档(使用msoffice2013)进行bits和bob操作,包括用DispatchEx打开另一个文档。。。在

^{pr2}$

尝试分配第二个ExceLDocument类将导致脚本崩溃。在

如果我将init改为

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

脚本运行良好。在

如果运行脚本时打开了excel文件 a、 脚本将在编辑打开的文件时崩溃。 b、 当执行这些代码行时,打开的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文件?在


Tags: 文件self脚本makeapplicationinitdefexcel
1条回答
网友
1楼 · 发布于 2024-10-02 08:30:06

设计脚本时,应该假设只有一个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()

相关问题 更多 >

    热门问题