如何使用Python关闭指定目录下所有已打开的Excel文件?
需求:关闭指定目录下所有已打开的Excel文件
我正在用Python做任务自动化,需要关闭指定目录(比如C:\MyExcelFiles)下当前所有已打开的Excel文件。这些文件是从SAP提取数据后自动打开的,数量多,手动关闭效率低,想通过编程自动关闭来优化工作流。目前只找到关闭系统所有打开Excel文件的方案,没法实现仅关闭指定目录下文件的功能。试过pywin32,但现有代码会关闭所有位置的Excel文件,没达到预期效果。
以下是我尝试的代码:
# Delay de 5 segundos time.sleep(5) # Nome da planilha que queremos verificar excel_file_name = f"{valor.replace('*', '')}.xlsx" # Função para verificar se um arquivo Excel está aberto def is_excel_file_open(file_name): # Itera pelos processos ativos for proc in psutil.process_iter(['pid', 'name']): try: # Verifica se o processo é do Excel if proc.info['name'] == 'EXCEL.EXE': for file in proc.open_files(): # Se o arquivo está aberto pelo Excel, retorna True if file_name in file.path: return proc except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass return None # Função para fechar o arquivo se estiver aberto def close_excel_file(file_name): process = is_excel_file_open(file_name) if process: print(f"Fechando o arquivo: {file_name}") process.terminate() # Envia o comando de término para o processo process.wait() # Espera até o fechamento completo do processo print("Arquivo fechado com sucesso!") else: print(f"O arquivo {file_name} não está aberto.") # Caminho completo do arquivo Excel excel_path = os.path.join("C:\TEMP\Avaliacao", excel_file_name) # Fecha o arquivo se estiver aberto close_excel_file(excel_path)
解决方案
问题分析
当前代码存在两个核心问题:
- 调用
process.terminate()会直接终止整个Excel进程,导致该进程下所有打开的文件被关闭,无法精准控制仅关闭指定目录的文件。 - 仅针对单个文件名做检查,无法批量处理指定目录下的所有已打开文件。
优化脚本(基于pywin32精准操作)
通过pywin32操控Excel的COM对象,可以直接访问每个打开的工作簿,精准关闭目标目录下的文件,不会影响同一进程中其他目录的文件。
import os import win32com.client from win32com.client import constants def close_excel_files_in_dir(target_dir): # 标准化目标目录路径,统一为Windows格式,避免路径格式差异导致匹配失败 target_dir = os.path.normpath(target_dir) # 获取当前活跃的Excel应用实例 try: excel_app = win32com.client.GetActiveObject("Excel.Application") except Exception: print("当前没有运行中的Excel进程") return # 反向遍历工作簿集合,避免删除操作导致的索引错乱 for workbook in reversed(excel_app.Workbooks): try: # 获取工作簿的完整路径并标准化 workbook_full_path = os.path.normpath(workbook.FullName) # 检查工作簿路径是否包含目标目录 if target_dir in workbook_full_path: print(f"正在关闭文件: {workbook_full_path}") # 关闭工作簿不保存(如需保存,替换为constants.xlSaveChanges) workbook.Close(constants.xlDoNotSaveChanges) except Exception as e: print(f"处理文件时出错: {str(e)}") # 替换为你的目标目录路径 close_excel_files_in_dir(r"C:\MyExcelFiles")
脚本说明
- 精准控制:直接操作单个工作簿,仅关闭路径匹配目标目录的文件,不会终止整个Excel进程。
- 批量处理:自动遍历所有打开的工作簿,无需逐个指定文件名。
- 路径兼容:使用
os.path.normpath()统一路径格式,解决斜杠/反斜杠、相对路径等导致的匹配问题。 - 灵活配置:可根据需求修改关闭时的保存策略(保存/不保存/提示保存)。
注意事项
- 确保已安装pywin32:执行
pip install pywin32完成安装。 - 若Excel文件处于保护模式(如带宏的文件),需手动授权后脚本才能正常访问。
- 如果需要保存文件,将
workbook.Close(constants.xlDoNotSaveChanges)改为workbook.Close(constants.xlSaveChanges)即可。
内容的提问来源于stack exchange,提问作者Lucas Brito
相关产品推荐
相关产品推荐

