![](/img/trans.png)
[英]Python 2.7 : Check if excel file is already open in program before saving it
[英]Python and Excel - check if file is open
大家好,我需要考虑使用Python中的win32com的帮助:我有一个例程,可以打开工作簿,创建工作表并在其中添加一些数据。 如果一切正常,将保存并关闭woorkbook-如果未终止python会话,但woorkbook保持打开状态。 因此,引用丢失了。 现在,当重新启动代码时,Excel会提示您味精“工作簿仍处于打开状态,您是否要重新打开?”。 所以我想要抑制这种味精。 我找到了一个解决方法,当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工作表进行了任何更改,则此方法已过时。 任何人都有一个想法如何从新的python会话取回对打开的和更改的工作表的引用? 谢谢
我不熟悉Python,但是用其他语言完成了一些Excel / Word COM代码。
Excel的Application.DisplayAlerts
属性可能会有所帮助。 将其设置为False
可抑制Excel通常可能显示的大多数消息,并自动选择默认响应,尽管我认为也有一些例外。 查看您现有的代码,我想您应该在打开工作簿之前插入以下行:
self.xlApp.DisplayAlerts = False
在终止Python解释器之前,您是否尝试过删除对COM对象的所有引用? 您可以强制使用垃圾回收器(使用gc.collect())来确保它们确实消失了。 这样,工作簿就不会在内存中保持打开状态,并且不会收到错误消息。
尝试向您的类中添加“ close()”方法,如下所示,并在脚本结束之前调用它。
import gc
...
def close(self):
del self.xlApp
if hasattr(self, 'xlBook'):
del self.xlBook
gc.collect()
您正在以错误的方式进行操作。 您不想让Python终止,而留下孤立的Excel进程。 如果要在其他计算机上安装并运行此代码,这尤其重要。 相反,找到您的错误并进行处理-这样您就永远不会有孤立的流程要处理。
也就是说,您可以考虑几件事。 您可以选择每次实例化一个新的Excel流程(Dispatch)或使用一个现有的Excel流程(DispatchEx)。 这使您可以执行诸如查看打开和关闭哪些工作簿的操作,或者确保您的过程不会干扰其他人。 同样正如Scott所说的,Excel应用程序具有一些有趣的属性,例如抑制无人看管的运行中的错误,值得学习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.