【问题标题】:Python: Close all open excel files from a folder (opened in multiple excel instances)Python:关闭文件夹中所有打开的excel文件(在多个excel实例中打开)
【发布时间】:2021-07-17 19:49:43
【问题描述】:

我只想关闭文件夹中所有打开的 excel 文件。其他优秀作品不应受到影响。 如果我使用下面的代码,那么它会杀死所有打开的 excel 会话,这是我不想要的。请帮忙-

os.system('TASKKILL /F /IM excel.exe')

或者

如果我使用下面的代码,那么它只会关闭一个特定的文件,所以这对我也不起作用-

from win32com.client import Dispatch
xl = Dispatch('Excel.Application')
wb = xl.Workbooks.Add()
wb.Close(True, r'C:\Path\to\folder\Test.xlsx')

【问题讨论】:

  • 为什么要使用 TASKKILL?
  • 您应该能够通过 xl.Workbooks 迭代打开的工作簿。例如for wb in xl.Workbooks: wb.Close()
  • @AnthonyKong 谢谢。你能通过Answer建议代码吗?因为我不确定我应该如何在这里提供文件夹参考。
  • 我不再是 Windows 用户,所以我无法测试我的建议。因此,我将其作为评论留下。

标签: python


【解决方案1】:

根据What defines which Excel instance an Excel.Application COM object connects to?

  • 您使用win32com.client.GetActiveObject(<ProgID>) 连接到现有 Excel 实例
  • 您只能连接到一个特定的正在运行的 Excel 实例。如果有多个运行,COM 类总是根据一定的逻辑选择其中一个(我在下面将其称为“优先级”)。
  • 您无法连接到以不同用户身份运行的 Excel 实例(这包括带 vs 不带提升)

因此,如果您的文件在多个 Excel 实例中打开,或者在不是“优先”的实例中打开,则迭代它们的唯一方法是重复连接到现有实例,然后终止它,以便另一个实例出现“在顶部”(直到在第一种情况下没有剩余,或者直到在第二种情况下您到达右侧)。如果有以不同用户身份运行的实例,您需要以所有相应用户身份多次运行您的代码。

  • 幸运的是,每个用户通常只能有一个“前台”(即可见的和手动启动的)Excel 实例,所有您打开的工作簿都会转到 - 即使它们显示为单独的窗口(通常 = 除非您手动修改 Application.Visible 属性),并且任何“背景”(通过 COM 以编程方式启动)优先。
    • 因此,终止任何不可见实例并在到达可见实例时停止应该是安全的。

但是,如果您的所有文件都在一个“优先”的 Excel 实例中打开,那么您连接到它,遍历打开的工作簿并关闭相应的工作簿:

import os.path
import win32com.client

x = win32com.client.GetActiveObject("Excel.Application")
for wb in x.Workbooks:
    if os.path.dirname(wb.FullName) == your_dir:
        wb.Close(True)    # do specify the SaveChanges arg (as shown) --
                          # otherwise, Excel will ask you interactively if there are changes,
                          # hanging the program until you make a choice
                          # (unless that's what you want, of course)
    del wb
del x

【讨论】:

  • 谢谢。请问`del wb del x`有什么用
  • 他们确保您释放对 Excel COM 对象的所有引用 -- an Excel instance can't terminate while they are alive
  • x = win32com.client.GetActiveObject("Excel.Application") for wb in x.Workbooks: if path.dirname(wb.FullName) == new_download_path: wb.Close(SaveChanges=False) del wb del x 我正在使用这个脚本。但没有运气:(
  • 那么你有我在答案的第一部分中描述的多个实例的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 2023-03-07
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2013-06-29
相关资源
最近更新 更多