我正在使用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文件?在
设计脚本时,应该假设只有一个Excel实例在运行,尽管它可以包含多个工作簿。如果您使用
GetObject
(而不是GetActiveObject
),那么win32com将返回一个句柄给现有的应用程序(如果存在的话),或者启动不存在的应用程序。因此您不需要If/else。在从设计的角度来说,这也意味着你应该有一种方法来跟踪哪些工作簿被打开,并且只关闭它们,这样Excel应用程序的最终状态与启动脚本时相同。因此,每个工作簿都有一个ExcelDocument实例,每个实例都使用
GetObject
,每个实例都关闭它所表示的工作簿。在创建第一个ExcelDocument之前,保存GetActiveObject
,这样脚本就知道它是否应该在退出时关闭应用程序。在基本上:
相关问题 更多 >
编程相关推荐