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时额外判断一下。

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