1. 问题背景:为什么要批量重命名工作表
本文主题是:批量重命名一个工作簿中的所有工作表。这个案例看起来不复杂,但它其实很有代表性,因为它解决的是 Excel 办公自动化里非常常见的一类问题:对象不是一个,而是一组;操作不是一次,而是批量重复执行。
在日常报表处理中,一个工作簿里经常会有很多工作表,比如 销售_1月、销售_2月、销售_3月、销售-华北、销售-华东。如果只是改一两张表,手动操作问题不大;但如果一个文件里有几十张工作表,每个月都要处理一次,手动重命名就会变成重复劳动。
推荐做法是:把这种“规则明确、重复次数多、人工容易漏”的工作交给 Python。人负责判断规则,脚本负责机械执行,这才是办公自动化真正能节省时间的地方。
这张图展示的是本文的整体主题:用 Python 操作 Excel,对工作簿中的工作表名称进行批量替换,从而实现一键重命名。

从图中可以看出,批量重命名的本质不是“打开 Excel 点几下”,而是把旧名称中的固定关键词提取出来,再用程序统一替换。比如将工作表名中的 销售 删除,最终得到更干净、更统一的名称结构。
2. 应用场景:哪些情况适合用脚本处理
这个案例最适合处理命名规则相对固定的 Excel 工作簿。比如每张表都带有相同前缀、相同业务关键词,或者每次导出的报表都会自动带上某些不需要的文字。只要重命名规则能说清楚,脚本就能稳定执行。
常见场景包括:月度销售报表、区域汇总报表、库存分类报表、部门统计表、项目进度表等。尤其是在一个工作簿里有大量 sheet 页时,批量处理的价值会非常明显。
不建议一上来就写复杂脚本。真正稳妥的做法是先拿一个测试文件验证规则,比如先确认要删除的关键词是什么、删除后会不会出现重名、是否会影响后续公式引用。脚本能提高效率,但不能替你判断业务规则是否正确。
这张图展示的是实际应用场景:将工作表名称中的关键词统一删除,用于报表批量处理和办公自动化。

从图中可以看出,处理前的工作表名称都包含 销售 这个关键词;处理后,关键词被统一删除,只保留月份或区域信息。这种场景非常适合用 replace() 完成,因为它的规则简单、目标明确、结果也容易验证。
3. 核心原理:不是重命名一张表,而是遍历一组表
批量重命名工作表的核心逻辑可以拆成三步:第一步,获取当前工作簿里的所有工作表;第二步,循环遍历每一张工作表;第三步,对每一张工作表的名称执行字符串替换。
原理上要抓住一个关键点:Excel 工作簿不是一个孤立文件,里面还包含很多对象,比如工作表、单元格、区域、图表等。本案例处理的对象就是工作表集合,也就是 workbook.sheets 或类似对象。
这张图展示的是代码层面的核心逻辑:获取工作表集合、通过循环逐张处理、最后使用 replace() 完成名称替换。

从图中可以看出,代码并不是直接“批量修改”,而是通过循环把批量任务拆成一张表一张表地处理。这个思路很重要,因为后面很多 Excel 自动化任务都是类似套路:先获取对象集合,再循环处理每个对象,最后保存结果。
4. 实现代码:用 replace 批量替换工作表名称
下面这段代码使用 xlwings 作为示例。它的好处是比较贴近真实 Excel 操作逻辑,适合初学者理解“打开工作簿、获取工作表、修改名称、保存关闭”的完整过程。
import xlwings as xw
file_path = r"e:\file\demo.xlsx" # 修改为你的 Excel 文件路径
old_word = "销售"
new_word = "" # 空字符串表示删除该关键词
app = xw.App(visible=False, add_book=False)
try:
wb = app.books.open(file_path)
worksheets = wb.sheets
for sht in worksheets:
old_name = sht.name
new_name = old_name.replace(old_word, new_word)
if old_name != new_name:
sht.name = new_name
wb.save()
wb.close()
finally:
app.quit()
这里的 old_word 表示要查找的旧关键词,new_word 表示替换后的新内容。如果 new_word 是空字符串,就相当于把旧关键词删除。比如 销售_1月 会变成 _1月。
推荐保留 old_name 和 new_name 两个变量。虽然直接写一行也能实现,但在实际排错时,保留变量更容易打印日志,也更容易判断脚本到底修改了哪些工作表。
如果想把 销售 替换成 营收,只需要这样修改:
old_word = "销售" new_word = "营收"
这类代码最怕的是“看起来运行成功,但结果不符合预期”。所以写完脚本之后,不要只看有没有报错,还要打开 Excel 文件检查工作表名称是否真正变更。
5. 进阶用法:只重命名部分工作表
真实办公场景里,不一定每次都要修改所有工作表。有时候只想改第 2 张到第 5 张,有时候只想改名称中包含某个关键词的工作表。这时就不能简单地“全量遍历后全部替换”,否则很容易误伤正常工作表。
这里要有一个判断:全量处理适合规则非常统一的文件;部分处理适合结构复杂、混合多类工作表的文件。越是正式报表,越应该谨慎控制处理范围。
这张图展示的是两种常见的部分重命名方式:一种是通过切片控制工作表范围,另一种是通过条件判断筛选需要处理的工作表。

从图中可以看出,切片适合处理固定位置的工作表,比如第 2 到第 5 张;条件筛选适合处理名称中包含指定关键词的工作表,比如只处理包含 销售 的 sheet。相比全量处理,部分重命名更稳,也更符合真实办公场景。
如果只想处理第 2 到第 5 张工作表,可以使用切片:
for sht in worksheets[1:5]:
sht.name = sht.name.replace("销售", "")
这里要注意,Python 的切片是左闭右开,worksheets[1:5] 对应的是第 2、3、4、5 张工作表,不包括第 6 张。
如果只想处理名称中包含 销售 的工作表,可以使用条件判断:
for sht in worksheets:
if "销售" in sht.name:
sht.name = sht.name.replace("销售", "")
实际使用时我更推荐条件判断。因为它不依赖工作表位置,只依赖名称规则。只要命名规范稳定,条件判断就比固定序号更可靠。
6. 效果验证:脚本跑完不等于任务完成
很多初学者写自动化脚本时容易犯一个错误:只要程序没有报错,就认为任务完成了。这个判断太粗糙。办公自动化真正要看的是输出结果是否符合业务预期。
本案例至少要做三类验证:第一,工作表名称是否已经按规则替换;第二,是否存在误删关键词导致名称异常;第三,是否出现重名、非法字符或长度超限等问题。
如果是企业内部实际使用,我建议增加一份修改日志,把修改前和修改后的工作表名称都记录下来。这样后续出现问题时,能快速定位是哪张表被改过。
for sht in worksheets:
old_name = sht.name
new_name = old_name.replace(old_word, new_word)
if old_name != new_name:
print(f"重命名:{old_name} -> {new_name}")
sht.name = new_name
推荐先打印日志,再真正保存文件。如果第一次运行不确定结果,可以先不执行 wb.save(),只打印重命名计划,确认没问题后再保存。
7. 常见问题:批量重命名最容易踩的坑
批量重命名工作表看似简单,但有几个坑必须提前知道。Excel 对工作表名称有自己的限制,不是任何字符串都能作为 sheet 名称。
这张图展示的是批量重命名工作表时最常见的三个问题:工作表名重复、包含非法字符、名称长度超限。

从图中可以看出,Excel 工作表名称必须保持唯一。如果两个工作表替换后变成同一个名字,脚本就会失败。比如 销售报表 和 报表 在某些替换规则下可能都变成 报表,这就会造成重名冲突。
另外,工作表名称不能包含 \、/、:、*、?、[、] 等非法字符,也不能超过 31 个字符。如果脚本没有提前校验这些规则,批量运行时就可能中途报错,甚至导致部分表已经修改、部分表没有修改。
更稳妥的做法是先写一个名称校验函数,对新名称进行检查。下面是一个简单示例:
def is_valid_sheet_name(name):
invalid_chars = ['\\', '/', ':', '*', '?', '[', ']']
if not name:
return False
if len(name) > 31:
return False
for char in invalid_chars:
if char in name:
return False
return True
如果要进一步增强稳定性,还可以在重命名前先收集所有新名称,统一检查是否存在重复,而不是边改边发现问题。
new_names = []
for sht in worksheets:
new_name = sht.name.replace(old_word, new_word)
new_names.append(new_name)
if len(new_names) != len(set(new_names)):
raise ValueError("重命名后存在重复工作表名,请先检查规则。")
正式处理重要文件前,一定要先备份原文件。这个习惯比任何代码技巧都重要。脚本执行速度很快,错起来也很快;没有备份,后悔成本会很高。
8. 完整增强版代码:增加校验和日志输出
如果只是学习,前面的基础版代码已经够用。但如果准备把它作为自己的办公自动化脚本模板,我建议增加三个能力:名称校验、重复检测、日志输出。这样脚本更接近真实可用状态。
import xlwings as xw
file_path = r"e:\file\demo.xlsx"
old_word = "销售"
new_word = ""
def is_valid_sheet_name(name):
invalid_chars = ['\\', '/', ':', '*', '?', '[', ']']
if not name:
return False, "工作表名不能为空"
if len(name) > 31:
return False, "工作表名不能超过 31 个字符"
for char in invalid_chars:
if char in name:
return False, f"工作表名不能包含非法字符:{char}"
return True, "校验通过"
app = xw.App(visible=False, add_book=False)
try:
wb = app.books.open(file_path)
worksheets = wb.sheets
rename_plan = []
for sht in worksheets:
old_name = sht.name
new_name = old_name.replace(old_word, new_word)
valid, message = is_valid_sheet_name(new_name)
if not valid:
raise ValueError(f"{old_name} -> {new_name} 校验失败:{message}")
rename_plan.append((old_name, new_name))
new_names = [item[1] for item in rename_plan]
if len(new_names) != len(set(new_names)):
raise ValueError("重命名后存在重复工作表名,请调整替换规则。")
for old_name, new_name in rename_plan:
if old_name != new_name:
print(f"重命名:{old_name} -> {new_name}")
wb.sheets[old_name].name = new_name
wb.save()
wb.close()
finally:
app.quit()
这版代码比基础版更啰嗦,但更适合真实工作。因为它先生成重命名计划,检查没有问题之后才真正执行修改。这就是自动化脚本里很重要的思想:先预演,再执行。
如果处理的是非常重要的业务文件,还可以进一步增加备份逻辑,把原文件复制一份后再处理。这样即使规则写错,也能快速回退。
9. 总结提升:把小案例沉淀成自己的脚本思维
这一节表面上是在学习 replace() 和工作表重命名,本质上是在训练一种办公自动化思维:把人工重复操作抽象成对象、规则和循环。
对象是工作表,规则是名称替换,循环是逐张处理。只要这个思路掌握了,后面处理批量改文件名、批量改单元格内容、批量汇总多个工作簿,逻辑其实都是相通的。
不要只满足于“代码能跑”。真正有价值的自动化脚本,应该具备可验证、可回退、可复用的能力。尤其是涉及 Excel 文件修改时,脚本执行前要确认规则,执行中要有日志,执行后要检查结果。
我对这一节的理解是:批量重命名工作表不是一个孤立技巧,而是 Python 办公自动化中非常基础的能力模块。把这个模块写稳,后面很多 Excel 批处理任务都会更容易上手。












