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

时间:2010-05-12 06:46:13

标签: python excel

嘿伙计们,我需要帮助考虑Python中的win32com: 我有一个例程,它打开一个工作簿,创建一个工作表并在其上放置一些数据。 如果一切运行正常,woorkbook会保存并关闭 - 如果不是,python会话终止但是woorkbook保持打开状态。所以引用丢失了。现在,当重新启动代码时Excel会提示你msg“工作簿仍然打开,你想重新打开吗?”。 所以我想要的是抑制这个消息。当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。 任何人都有一个想法如何从新的python会话中获取对开放和更改的工作表的引用? THX

3 个答案:

答案 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应用程序有一些有趣的属性,比如抑制无人值守运行的错误,值得学习。