You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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()统一路径格式,解决斜杠/反斜杠、相对路径等导致的匹配问题。
  • 灵活配置:可根据需求修改关闭时的保存策略(保存/不保存/提示保存)。

注意事项

  1. 确保已安装pywin32:执行pip install pywin32完成安装。
  2. 若Excel文件处于保护模式(如带宏的文件),需手动授权后脚本才能正常访问。
  3. 如果需要保存文件,将workbook.Close(constants.xlDoNotSaveChanges)改为workbook.Close(constants.xlSaveChanges)即可。

内容的提问来源于stack exchange,提问作者Lucas Brito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:01:04