查看: 89|回复: 3

Python批量替换Excel多工作簿行数据:xlwings+enumerate实战

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在日常办公中,经常需要批量修正多个Excel文件中的固定错误行数据,比如部门名称变更、产品名称写错、负责人调整等。手动修改几十个工作簿不仅效率低,还容易遗漏。本文介绍如何使用Python的xlwings库,配合enumerate()精确定位行号,实现批量替换多个工作簿中的整行数据。

一、适用场景与风险提示
整行替换适合“确定性很强”的修正任务,例如多个文件中都存在同一旧记录(如[“北京”,“销售”,“张三”,1000]),需要统一替换为新记录(如[“北京”,“销售事业部”,“张三”,1200])。如果只是单列名称变更,优先考虑按列替换。注意:整行替换会覆盖多个字段,必须确保匹配条件足够准确,否则容易误改。

二、核心原理:enumerate()定位行号+精确匹配
程序流程:遍历指定文件夹中的所有Excel工作簿 → 读取指定工作表的数据区域(A1.current_region) → 去掉表头后逐行匹配 → 如果整行与旧行完全一致,则用新行替换。关键代码:
  1. for idx, row in enumerate(rows, start=2):
  2.     if row == old_row:
  3.         sht.range(f"A{idx}").value = new_row
复制代码
这里rows是去掉表头(table[1:])后的数据行列表。使用enumerate(..., start=2)使Python索引与Excel真实行号对齐(Excel第1行为表头,数据从第2行开始)。row == old_row是精确匹配,空格、数字类型(如1000 vs 1000.0)都会导致匹配失败,因此正式处理前需确认源数据格式。

三、完整代码实现
以下脚本使用xlwings,需要先安装:pip install xlwings。注意替换folder_path、sheet_name、old_row和new_row。
  1. import os
  2. import xlwings as xw
  3. folder_path = r"e:\file\target"
  4. sheet_name = "Sheet1"
  5. old_row = ["北京", "销售", "张三", 1000]
  6. new_row = ["北京", "销售事业部", "张三", 1200]
  7. app = xw.App(visible=False, add_book=False)
  8. try:
  9.     for file_name in os.listdir(folder_path):
  10.         if file_name.startswith("~$"):
  11.             continue
  12.         if not file_name.lower().endswith((".xlsx", ".xls", ".xlsm")):
  13.             continue
  14.         full_path = os.path.join(folder_path, file_name)
  15.         wb = app.books.open(full_path)
  16.         try:
  17.             sheet_names = [s.name for s in wb.sheets]
  18.             if sheet_name not in sheet_names:
  19.                 print(f"跳过:{file_name},不存在工作表 {sheet_name}")
  20.                 continue
  21.             sht = wb.sheets[sheet_name]
  22.             table_rng = sht.range("A1").current_region
  23.             table = table_rng.value
  24.             if not table or len(table) < 2:
  25.                 print(f"跳过:{file_name},没有可处理的数据")
  26.                 continue
  27.             rows = table[1:]
  28.             hit_count = 0
  29.             for idx, row in enumerate(rows, start=2):
  30.                 if row == old_row:
  31.                     sht.range(f"A{idx}").value = new_row
  32.                     hit_count += 1
  33.             if hit_count > 0:
  34.                 wb.save()
  35.                 print(f"已替换:{file_name},命中 {hit_count} 行")
  36.             else:
  37.                 print(f"未命中:{file_name}")
  38.         finally:
  39.             wb.close()
  40. finally:
  41.     app.quit()
复制代码
代码中增加了hit_count统计每个文件命中的行数。写入新行时使用sht.range(f"A{idx}").value = new_row,需要确认new_row字段数量与原表列数一致,否则可能残留旧数据或写到表格外。

四、关键细节与常见坑
1. 必须跳过~$临时文件。
2. 先检查目标工作表是否存在,否则报错。
3. 行匹配是精确比较,如果Excel中数字读取为浮点数(如1000.0),而old_row写的是整数1000,则匹配失败。建议先打印rows查看真实数据格式。
4. 正式替换前先运行“预览模式”:只打印命中的文件名、行号和旧行内容,不执行写入和保存。确认无误后再放开保存。

五、效果验证与安全建议
不要仅凭控制台输出“已替换”就认为成功。建议做三类验证:
- 检查命中数量是否符合预期(例如总共应命中6行)。
- 随机打开几个目标文件,确认旧行已变成新行。
- 确认文件可以正常打开无损坏。
建议在副本目录中先测试,不要直接在原始文件夹运行。

六、总结提升
本文的核心价值不是记enumerate(),而是理解“遍历文件→定位行号→精确匹配→替换保存”的完整流程。可复用经验:
- 精确匹配适合确定性修正,格式混乱时需先清洗。
- 批量脚本必须有命中统计,方便复盘。
- 保存处理日志(文件名、行号、旧数据、新数据),便于追溯。
在此基础上可以扩展为带界面的小工具,或增加日志记录功能,从脚本走向可交付工具。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python批量替换Excel多工作簿行数据:xlwings+enumerate实战

非常实用的分享,特别是在精确匹配和避免常见坑(如浮点数与整数、临时文件跳过)方面讲得很清楚。我有个小建议:如果数据量大或者工作簿多,可以考虑先用“预览模式”打印匹配的行号和旧行内容,确认无误后再正式写入,这样能防止批量误改。另外,对于数字类型不一致的问题,在匹配前统一对 old_row 和 rows 中的数字做 str() 或格式化处理,也许能减少匹配失败的情况。感谢楼主写这么详细的实战指南!
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python批量替换Excel多工作簿行数据:xlwings+enumerate实战

感谢分享,非常实用的实战教程!几个细节想请教确认:如果工作表的数据区域不是从A1开始(比如前面有合并标题或空行),`current_region`只能取到连续区域,这种情况需要怎么处理?另外,建议在代码里加一个`preview`布尔开关,预览时只打印不写入,新手用起来更安全。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python批量替换Excel多工作簿行数据:xlwings+enumerate实战

感谢分享!这个教程写得非常详细,尤其是风险提示和验证部分特别实用。我之前手动改过类似数据,总是漏改或改错,现在用这个脚本可以放心批量处理了。想问一下,如果文件里的旧行不止一种(比如同时要替换多个不同的旧行),是不是可以再加一层循环或者把旧行和新行做成字典来遍历?另外,对于数字类型匹配的问题,有没有办法统一转换成字符串再比较,避免整数和浮点数不匹配的坑?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-1 12:04 , Processed in 0.029442 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部