我的知识记录

Python Excel批量替换单元格内容:find-and-replace自动化

用openpyxl遍历单元格,按关键词批量替换Excel里的文本,支持多对多替换映射,避免在Excel里按Ctrl+H反复点。

场景痛点

业务改版,原来叫「微信支付」现在叫「微信支付(商户号)」,原来的「线上」改成「线上下单」。一张表里几十个格子要改,多张表一起改,Ctrl+H 按到吐。用 openpyxl 把替换映射写成一个字典,扫一遍所有单元格自动替换,几百张表都是几秒的事。

用到的库

pip install openpyxl

完整代码

from openpyxl import load_workbook


REPLACE_MAP = {
"微信支付": "微信支付(商户号)",
"线上": "线上下单",
"线下": "线下门店",
"华北区": "华北大区",
}


def batch_replace(file_path: str) -> int:
wb = load_workbook(file_path)
total_hits = 0

for ws in wb.worksheets:
for row in ws.iter_rows():
for cell in row:
if not isinstance(cell.value, str):
continue
new_value = cell.value
for old, new in REPLACE_MAP.items():
if old in new_value:
new_value = new_value.replace(old, new)
if new_value != cell.value:
cell.value = new_value
total_hits += 1

wb.save(file_path)
print(f"共替换 {total_hits} 个单元格")
return total_hits


if __name__ == "__main__":
batch_replace(r"D:\reports\销售明细.xlsx")

代码讲解

  • REPLACE_MAP 是一个字典,key 是要找的旧词,value 是替换成的新词;要加替换规则就在这里加一行。
  • 外层循环 wb.worksheets 遍历所有工作表,不只改活动表。
  • iter_rows() 拿到所有行,再逐格判断:只有 isinstance(cell.value, str) 才是文本,数字、日期跳过,避免误伤。
  • 对每个文本依次应用字典里所有替换规则;用 str.replace(old, new) 做子串替换,if old in new_value 先判断再替换省时间。
  • 替换后和原值不同才写回,同时计数;最后保存。
  • 如果只想替换某几列,把内层循环换成 iter_rows(min_col=..., max_col=...) 即可。

运行结果

运行后控制台打印替换了多少个格子;打开文件,所有出现「微信支付」「线上」「线下」「华北区」的地方都被替换成新词,数字、日期、金额不受影响。

注意事项

  • str.replace 是子串替换,「线上」会替换掉「线上渠道」里的「线上」变成「线上下单渠道」,不想要这种误伤就用精确匹配:if cell.value == old: cell.value = new
  • 替换前先备份,字典里写错词可能把正常文字改坏。
  • 替换规则有先后顺序,比如先把「线上」换成「线上下单」,再把「线上下单」换成别的,注意别互相覆盖。
  • 大表逐格替换较慢,几万格也在秒级;如果只想替换某一列,限定列范围能快很多。
  • 公式单元格的内容是公式字符串,替换时要小心别把 SUM 这种公式名也改了;不希望动公式就 data_only=False 时额外判断一下。

Python Excel批量替换单元格内容:find-and-replace自动化

标签:

更新时间:2026-09-15 09:13:11

上一篇:Python Excel设置单元格背景色:PatternFill高亮条件行

下一篇:Python Excel批量修改列名