Python实现多.xlsx数据复制至不同子文件夹的.xlsm文件
修改后的适配代码
import os from pathlib import Path import openpyxl from openpyxl import load_workbook def copy_data(src_file: str, dst_file: str) -> None: # 打开文件 wb_src = load_workbook(src_file, read_only=True) ws_src = wb_src["src sheet"] wb_dst = load_workbook(dst_file, keep_vba=True) ws_dst = wb_dst["dest sheet"] # 配置参数 start_row_src = 2 start_row_dst = 10 # 计算复制的行数:取源表实际数据行,避免空循环 max_data_row = ws_src.max_row rows2copy = max_data_row if max_data_row <= 100000 else 100000 # 复制数据:修正偏移量计算逻辑 row_offset = start_row_dst - start_row_src for i in range(start_row_src, rows2copy + 1): dst_row = i + row_offset ws_dst[f"A{dst_row}"].value = ws_src[f"A{i}"].value ws_dst[f"B{dst_row}"].value = ws_src[f"B{i}"].value # 保存目标文件,否则修改不会生效 wb_dst.save(dst_file) # 关闭工作簿释放资源 wb_src.close() wb_dst.close() # 文件目录配置 src_dir_path = "C:/Users/me/Documents/Mysourcefolder/" dst_root_dir = "C:/Users/me/Documents/Mydestinationfolder/" # 遍历源文件夹下所有xlsx文件 for src_path in Path(src_dir_path).glob("*.xlsx"): # 获取源文件名的前缀(比如ABC_Report.xlsx -> ABC) src_filename = os.path.basename(src_path) prefix = src_filename.split("_Report.xlsx")[0] # 构造目标文件路径:根目录/前缀子文件夹/前缀_2023.xlsm dst_file = os.path.join(dst_root_dir, prefix, f"{prefix}_2023.xlsm") # 检查目标文件是否存在,避免报错 if os.path.exists(dst_file): copy_data(str(src_path), dst_file) print(f"已完成数据复制:{src_filename} -> {dst_file}") else: print(f"警告:目标文件不存在,跳过:{dst_file}")
关键修改点说明
- 路径适配逻辑:从源文件名提取前缀(如
ABC),自动拼接目标文件的子文件夹路径,完美匹配你需要的目标根目录/ABC/ABC_2023.xlsm格式 - 修复核心功能缺失:添加
wb_dst.save(dst_file),原代码未保存目标文件,所有修改都不会生效 - 优化数据复制效率:
- 源工作簿用
read_only=True打开,提升大文件读取速度 - 用
ws_src.max_row获取实际数据行,避免固定100000行的无效循环 - 修正偏移量计算逻辑,确保源表和目标表的行号对应正确
- 源工作簿用
- 错误防护:添加目标文件存在性检查,避免因文件缺失导致的运行报错
- 代码规范修复:修正原代码的缩进错误,补充
Path导入(原代码未导入但使用了该类)
内容的提问来源于stack exchange,提问作者ohmandy
相关产品推荐
相关产品推荐

