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

使用win32com批量处理各子文件夹最新Excel文件的问题

批量处理子文件夹中最新xlsm文件

需求:主文件夹下包含37个子文件夹,需遍历每个子文件夹,找到其中最新的.xlsm文件,通过win32com打开后重新保存并关闭。原代码仅能处理单个子文件夹,需调整实现批量操作。

背景:用openpyxl保存的文件无法被R Studio正常读取,通过win32com重新保存可解决此问题,因此需要自动化批量处理。

修改后的代码

import os
import glob
from win32com.client import Dispatch

main = r'C:\Users\me\Documents\themainfolder'

# 初始化Excel应用,避免重复创建进程
xlApp = Dispatch("Excel.Application")
xlApp.Visible = False

# 遍历主文件夹下的所有子文件夹
for root, dirs, files in os.walk(main):
    # 只处理当前层级的直接子文件夹
    for subdir in dirs:
        subfolder_path = os.path.join(root, subdir)
        # 获取子文件夹下所有xlsm文件
        xlsm_files = glob.glob(os.path.join(subfolder_path, "*.xlsm"))
        
        if not xlsm_files:
            print(f"子文件夹 {subfolder_path} 中未找到xlsm文件,跳过")
            continue
        
        # 找到最新的xlsm文件
        latest_file = max(xlsm_files, key=os.path.getmtime)
        print(f"正在处理文件: {latest_file}")
        
        # 打开、保存、关闭文件
        try:
            xlBook = xlApp.Workbooks.Open(latest_file)
            xlBook.Save()
            xlBook.Close()
        except Exception as e:
            print(f"处理文件 {latest_file} 时出错: {str(e)}")
            # 出错时确保关闭文件
            if 'xlBook' in locals():
                xlBook.Close(False)

# 退出Excel应用,释放资源
xlApp.Quit()
del xlApp

关键修改说明

  • 将Excel应用的初始化移到循环外,避免反复创建Excel进程,提升效率并减少系统资源占用
  • 增加xlsm文件存在判断,避免子文件夹无对应文件时触发报错
  • 添加异常捕获机制,处理文件操作中的意外情况,同时保证出错时文件能被关闭
  • 遍历完成后主动退出Excel应用并清理COM对象,防止后台残留Excel进程
  • 优化os.walk的处理逻辑,确保仅处理主文件夹下的直接子文件夹(如需递归处理更深层级,可调整逻辑直接在当前目录查找xlsm文件)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:15:16