我只想关闭文件夹中所有打开的 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')
答案 0 :(得分:1)
根据What defines which Excel instance an Excel.Application COM object connects to?:
win32com.client.GetActiveObject(<ProgID>)
因此,如果您的文件在多个 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