繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM