使用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
相关产品推荐
相关产品推荐

