Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python和Excel-检查文件是否打开_Python_Excel - Fatal编程技术网

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

Python和Excel-检查文件是否打开,python,excel,Python,Excel,嘿,伙计们,我需要帮助考虑Python中的win32com: 我有一个例程,可以打开工作簿,创建工作表,并在上面放置一些数据。 如果一切正常,woorkbook将被保存并关闭——如果不是,python会话将终止,但woorkbook将保持打开状态。所以参考丢失了。现在,当重新启动代码时,Excel会提示您消息“工作簿仍处于打开状态,是否要重新打开?”。 所以我想要的是抑制这个味精。我找到了一个在python在写入工作表之前终止时适用的解决方案: open_copys = self

嘿,伙计们,我需要帮助考虑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会话中获取对已打开和更改的工作表的引用吗?
thx

我不熟悉Python,但用其他语言编写了一些Excel/Word COM代码。
Excel的
应用程序.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)或使用现有进程(DispatchEx)。这可以让您执行一些操作,例如查看哪些工作簿打开并关闭它们,或者确保您的流程不会干扰其他人。正如Scott所说,Excel应用程序有一些有趣的特性,比如在无人值守的情况下抑制错误,这是值得学习的。

您是否可以将python脚本更改为关闭excel,即使它终止,例如捕获以excel结尾的异常?否脚本太大,无法插入异常句柄。我认为您可能混淆了Dispatch和DispatchEx。