如何用Python+openpyxl实现多Excel源文件数据批量复制到对应目标文件
批量实现Excel指定区域数据复制(基于openpyxl)
核心思路
将单文件的复制逻辑封装为可复用函数,通过定义文件配对列表批量处理40组源/目标文件,避免重复编写相同代码。
完整批量处理代码
import openpyxl from pathlib import Path def copy_excel_data(source_path, dest_path, source_sheet, source_range, dest_sheet, dest_range): """ 复制指定Excel文件的指定区域数据到目标文件的指定区域 参数: source_path: 源Excel文件路径 dest_path: 目标Excel文件路径 source_sheet: 源文件待复制工作表名称 source_range: 源文件待复制单元格区域(如"A9:B100000") dest_sheet: 目标文件待粘贴工作表名称 dest_range: 目标文件待粘贴单元格区域(如"A2:B100000") """ # 提前检查文件是否存在,避免加载报错 if not Path(source_path).exists(): print(f"警告:源文件 {source_path} 不存在,跳过") return if not Path(dest_path).exists(): print(f"警告:目标文件 {dest_path} 不存在,跳过") return try: # 加载源文件 wbo = openpyxl.load_workbook(source_path) wso = wbo[source_sheet][source_range] # 加载目标文件(保留VBA宏) wbd = openpyxl.load_workbook(dest_path, keep_vba=True) wsd = wbd[dest_sheet][dest_range] # 逐单元格复制数据值 for row1, row2 in zip(wso, wsd): for cell1, cell2 in zip(row1, row2): cell2.value = cell1.value # 保存修改后的目标文件 wbd.save(dest_path) print(f"处理完成:{source_path} → {dest_path}") except Exception as e: print(f"处理 {source_path} → {dest_path} 时出错:{str(e)}") # ------------------- 配置区域 ------------------- # 定义所有需处理的源/目标文件配对,每个元组对应一组文件的参数 file_pairs = [ # 示例:对应你提供的单文件案例 ("ABC_Export.xlsx", "ABC_2023.xlsm", "Report Data", "A9:B100000", "Sheet1", "A2:B100000"), # 添加剩余39组配对,格式与示例一致 ("DEF_Export.xlsx", "DEF_2023.xlsm", "Report Data", "A9:B100000", "Sheet1", "A2:B100000"), ("GHI_Export.xlsx", "GHI_2023.xlsm", "Report Data", "A9:B100000", "Sheet1", "A2:B100000"), # ... 继续补充其他配对 ] # ------------------- 执行批量处理 ------------------- for pair in file_pairs: copy_excel_data(*pair)
关键说明
- 函数封装:将重复的单文件操作逻辑打包成函数,后续调整复制规则(如修改区域、添加格式复制)只需改动函数内部。
- 集中配置:所有文件配对统一管理在
file_pairs列表中,添加或修改配对直观方便。 - 异常防护:单个文件处理失败不会中断整个批量任务,错误信息可帮助快速排查问题。
- 存在性检查:提前验证文件是否存在,避免因文件缺失导致的加载错误。
扩展优化建议
如果源文件和目标文件命名有规律(如XXX_Export.xlsx对应XXX_2023.xlsm),可自动生成配对列表,无需手动逐个输入:
# 示例:自动匹配同目录下的源/目标文件 source_dir = Path("./") file_pairs = [] # 遍历所有以_Export.xlsx结尾的源文件 for source_file in source_dir.glob("*_Export.xlsx"): # 生成对应的目标文件名 dest_file_name = source_file.name.replace("_Export.xlsx", "_2023.xlsm") dest_file = source_dir / dest_file_name if dest_file.exists(): file_pairs.append( (str(source_file), str(dest_file), "Report Data", "A9:B100000", "Sheet1", "A2:B100000") )
内容的提问来源于stack exchange,提问作者ohmandy
相关产品推荐
相关产品推荐

