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。 任何人都有一个想法如何从新的python会话中获取对开放和更改的工作表的引用? THX
答案 0 :(得分:3)
我不熟悉Python,但用其他语言做了一些Excel / Word COM代码
Excel的Application.DisplayAlerts
属性可能有所帮助。将其设置为False
可以抑制Excel通常显示的大多数消息,并自动选择默认响应,但我认为有一些例外。
查看现有代码,我猜您在打开工作簿之前插入了这一行:
self.xlApp.DisplayAlerts = False
答案 1 :(得分:1)
在终止Python解释器之前,您是否尝试删除对COM对象的所有引用?你可以强制它们被垃圾收集(使用gc.collect())来确定它们已经消失了。这样,工作簿不应该在内存中保持打开状态,并且您将不会收到错误消息。
尝试在您的课程中添加“close()”方法,如下所示,并在脚本结束前调用它。
import gc
...
def close(self):
del self.xlApp
if hasattr(self, 'xlBook'):
del self.xlBook
gc.collect()
答案 2 :(得分:1)
你这是错误的方式。你不想让Python终止,留下孤立的Excel进程。如果要在其他计算机上安装和运行此代码,这一点尤为重要。相反,找到你的错误并处理它们 - 然后你永远不会有孤立的进程来处理。
那就是说,你可以考虑一些事情。您可以选择每次实例化一个新的Excel进程(Dispatch)或使用现有的进程(DispatchEx)。这使您可以执行以下操作:查看哪些工作簿处于打开状态并将其关闭,或确保您的流程不会干扰其他工作簿。另外,正如斯科特所说,Excel应用程序有一些有趣的属性,比如抑制无人值守运行的错误,值得学习。