Python和Excel – 检查文件是否打开

嘿家伙,我需要帮助考虑Python中的win32com:我有一个例程,打开一个工作簿,创build一个工作表,并把一些数据。 如果一切运行良好,woorkbook被保存并closures – 如果不是python会话被终止,但woorkbook保持打开状态。 所以参考失去了。 现在,当重新启动代码时,Excel会提示您msg“工作簿仍然打开,是否要重新打开?”。 所以我想要的是压制这个味精。 我发现了一个解决scheme,在python写入表单之前终止:

open_copys = self.xlApp.Workbooks.Count if open_copys > 0: """ Check if any copy is the desired one""" for i in range(0, open_copys): if(self.xlApp.Workbooks[i].FullName == self.file_path): self.xlBook = self.xlApp.Workbooks[i] else: self.xlBook = self.xlApp.Workbooks.Open(self.file_path) 

但是,如果EXCEL表单上有任何更改,则此方法为obsolet。 任何人都有一个IDE如何从一个新的python会话找回一个开放和改变的工作表的引用? 谢谢

你有没有试图在终止Python解释器之前删除所有对你的COM对象的引用? 你可以强制他们被垃圾收集(使用gc.collect())来确定他们已经不在了。 这样,工作簿不应在内存中保持打开状态,并且不会出现错误消息。

尝试添加一个“close()”方法到你的类,如下所示,并在脚本结束之前调用它。

 import gc ... def close(self): del self.xlApp if hasattr(self, 'xlBook'): del self.xlBook gc.collect() 

我不熟悉Python,但已经做了一些其他语言的Excel / Word COM代码。
Excel的Application.DisplayAlerts属性可能有所帮助。 将其设置为False抑制Excel可能正常显示的大多数消息,并自动select默认响应,但我认为有一些例外情况。 看看你现有的代码,我猜你会打开工作簿之前插入这一行:

  self.xlApp.DisplayAlerts = False 

你这样做是错误的。 你不想让Python终止,离开孤立的Excel进程。 如果要在其他机器上安装并运行此代码,这一点尤其重要。 相反,find你的错误,并处理它们 – 那么你永远不会有孤立的进程来处理。

也就是说,你可以考虑一些事情。 您可以select每次实例化新的Excel进程(Dispatch)或使用现有的DispatchEx(DispatchEx)。 这可以让你做一些事情,比如看看哪些工作簿打开,closures它们,或者确保你的过程不会干扰别人。 正如斯科特所说,Excel应用程序有一些有趣的属性,如抑制无人值守运行的错误,值得学习。