Python:关闭文件夹中所有打开的excel文件(在多个excel实例中打开)

时间:2021-07-17 08:14:37

标签: python

我只想关闭文件夹中所有打开的 Excel 文件。其他 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')

1 个答案:

答案 0 :(得分:1)

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

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

因此,如果您的文件在多个 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
相关问题