Python:使用Win32 COM Api打开Excel工作簿

我正在使用以下代码在Excel中打开并显示工作簿:

import win32com.client as win32 excel = win32.gencache.EnsureDispatch('Excel.Application') wb = excel.Workbooks.Open('my_sheet.xlsm') ws = wb.Worksheets('blaaaa') excel.Visible = True 

当文件“my_sheet.xlsm”已被打开时,Excel会询问我是否要重新打开而不保存。

我怎么能预先检查工作簿是否已经打开,如果是,就把它放在前面?

编辑 :现在发现:

 if excel.Workbooks.Count > 0: for i in range(1, excel.Workbooks.Count+1): if excel.Workbooks.Item(i).Name is 'my_sheet.xlsm': wb = excel.Workbooks.Item(i) break 

还有一个问题 :我的工作表包含一些标题,我启用了一些过滤。 所以当filter被设置,当我从Python打开工作簿时,有时会要求我input一个唯一的名称来保存filter。 这是为什么? 这是对话:

在这里输入图像说明

编辑确定它说(德语)后面的问题是2007年和2010年文件中的已知错误: https : //social.msdn.microsoft.com/Forums/de-DE/3dce9f06-2262-4e22-a8ff- 5c0d83166e73 / excel-api-interne-namen ,它似乎存在,如果以编程方式打开Excel文件。 不知道是否有解决方法。

在find解决scheme的同时,请考虑使用try / except / finally块。 目前,您的代码将使Excel.exe进程在后台运行(如果使用Windows,请检查任务pipe理器),即使您closures了可见工作表。 另外,在Python或任何其他语言(如VBA)中,任何外部API(如此COM接口)应始终在应用程序代码中干净地发布。

下面的解决scheme使用定义的函数openWorkbook()来执行两个潜在的路线:1)首先尝试重新启动指定的工作簿,假定它被打开; 2)如果当前未打开,则启动该位置的新的工作簿对象。 如果Workbooks.Open()方法失败,如错误的文件名,则使用最后的嵌套try/except

 import win32com.client as win32 def openWorkbook(xlapp, xlfile): try: xlwb = xlapp.Workbooks(xlfile) except Exception as e: try: xlwb = xlapp.Workbooks.Open(xlfile) except Exception as e: print(e) xlwb = None return(xlwb) try: excel = win32.gencache.EnsureDispatch('Excel.Application') wb = openWorkbook(excel, 'my_sheet.xlsm') ws = wb.Worksheets('blaaaa') excel.Visible = True except Exception as e: print(e) finally: # RELEASES RESOURCES ws = None wb = None excel = None