在 Excel 自动化里,命名范围往往比直接写单元格地址更容易维护。尤其是报表字段多、公式复杂、数据区域还会变化时,像 A1:E20 这样的硬编码引用很快就会变得难读也难改。下面就按实际使用顺序,梳理如何用 Python 配合 Spire.XLS 创建、查询、调整和删除命名范围,同时说明不同作用域的差别,以及哪些场景更适合把它放进公式和批处理流程里。
环境准备与基础写法
本文使用的是 Spire.XLS for Python。先安装库,再在脚本中导入对应模块:
pip install Spire.XLS
from spire.xls import * from spire.xls.common import *
后续示例都围绕 Workbook、工作表对象以及命名范围集合展开。常见流程通常是先读取现有文件,再定位工作表,最后通过命名范围集合进行操作。
如何创建命名范围,以及全局与局部有什么区别
创建命名范围的核心,就是把一个名称绑定到某段单元格区域。对于整个工作簿都要共享的区域,可以直接使用 workbook.NameRanges;如果只希望在某一张工作表内生效,则应使用 sheet.Names。

创建工作簿级命名范围
工作簿级命名范围在整个文件内可用,适合总表、公共数据区、统一指标区这类会被多个工作表引用的区域。

workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
# 创建命名范围并绑定到指定区域
named_range = workbook.NameRanges.Add("SalesData")
named_range.RefersToRange = sheet.Range["A1:E20"]
workbook.Sa veToFile("output.xlsx", ExcelVersion.Version2010)
workbook.Dispose()
NameRanges.Add() 返回的是一个 INamedRange 对象,真正决定它指向哪里的,是 RefersToRange 属性。设置完成后,SalesData 就可以替代 A1:E20 被公式或代码直接引用。
创建工作表级命名范围
如果同一个工作簿里有多张结构相近的工作表,而且每张表都想定义自己的“本地”区域,那么工作表级命名范围更合适。它可以减少命名冲突,也方便同名区域在不同工作表中并存。
named_range = workbook.NameRanges.Add("GlobalRange")
named_range.RefersToRange = sheet.Range["A1:D10"]
named_range = sheet.Names.Add("LocalRange")
named_range.RefersToRange = sheet.Range["A1:D19"]
简单理解就是:workbook.NameRanges 管整个工作簿,sheet.Names 只管当前工作表。若多个工作表需要各自独立定义同名区域,优先选后者。
查询、定位与重命名命名范围
创建完成之后,真正高频的工作通常是查询和维护。比如列出当前文件里有哪些命名范围、按名称取回某个对象、查看它实际指向的地址,或者判断某段区域是否已经定义过名称。
获取全部命名范围
遍历 NameRanges 集合即可拿到工作簿中的所有命名范围名称:
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
for name_range in workbook.NameRanges:
print(name_range.Name)
workbook.Dispose()
这类遍历很适合做批量检查,例如清点旧模板中遗留的命名范围,或输出日志做后续审计。
按索引或名称获取指定命名范围
# 通过索引获取 range_by_index = workbook.NameRanges[1] # 通过名称获取 range_by_name = workbook.NameRanges["SalesData"]
按名称访问通常更直观,尤其在业务脚本里可读性更高;按索引则更适合处理一批未知名称的历史文件。
查看命名范围对应的单元格地址
如果想确认某个名称到底指向哪里,可以通过 RefersToRange 继续拿到区域对象,再读取地址:
named_range = workbook.NameRanges[0]
cell_range = named_range.RefersToRange
address = cell_range.RangeAddress
print(f"命名范围 {named_range.Name} 的地址为 {address}")
这一步在调试公式引用、核对模板变更时尤其有用。很多“公式算错”的问题,本质上都是命名范围已经指向了不再正确的区域。
根据单元格区域反查命名范围
如果你手上只有一个区域,想判断它是否已经被命名,可以使用 GetNamedRange():
sheet = workbook.Worksheets[0]
cell_range = sheet.Range["A2:D2"]
result = cell_range.GetNamedRange()
if result is not None:
print(f"该区域对应的命名范围: {result.Name}")
这在模板治理或自动修复脚本里很实用,能避免对已存在的命名范围重复创建。
重命名已有命名范围
已有命名范围不需要删除重建,直接修改 Name 属性即可:
workbook.NameRanges[0].Name = "UpdatedRangeName"
重命名之后,引用该名称的公式会自动更新,这一点与 Excel 的原生行为一致。对于已经在业务中广泛使用的模板来说,这种改法比直接改公式要稳妥得多。
如何对命名范围做样式处理,并直接用于公式
命名范围的价值不只是在“取个名字”。一旦拿到它所指向的区域对象,就可以像操作普通单元格区域一样继续设置样式、合并单元格,或者把它放进公式里。
格式化命名范围对应区域
通过 RefersToRange 取到区域后,可以直接设置背景色、字体等样式:
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
named_range = workbook.NameRanges[0]
cell_range = named_range.RefersToRange
# 设置背景色
cell_range.Style.Color = Color.get_Yellow()
# 设置字体加粗
cell_range.Style.Font.IsBold = True
workbook.Sa veToFile("formatted_output.xlsx", ExcelVersion.Version2010)
workbook.Dispose()
这意味着命名范围既可以是公式引用入口,也可以充当“目标区域句柄”,让代码更容易定位需要高亮或统一格式化的数据块。
合并命名范围内的单元格
如果命名范围覆盖的是标题区域或展示区,同样可以执行合并:
named_range = workbook.NameRanges[0] cell_range = named_range.RefersToRange # 合并单元格 cell_range.Merge()
合并通常用于跨列标题、说明栏等固定布局区域。前提是你已经确认该区域结构适合合并,否则可能影响后续数据写入和公式计算。
在公式中直接引用命名范围
这是命名范围最常见、也最值得使用的场景。相比把地址硬编码进公式,使用名称可以明显提升可读性,而且后续调整区域范围时,不必挨个改公式。
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
# 创建命名范围
named_range = workbook.NameRanges.Add("ScoreRange")
named_range.RefersToRange = sheet.Range["B10:B12"]
# 在公式中引用命名范围
sheet.Range["B13"].Formula = "=SUM(ScoreRange)"
# 填入数据
sheet.Range["B10"].Value2 = Int32(10)
sheet.Range["B11"].Value2 = Int32(20)
sheet.Range["B12"].Value2 = Int32(30)
workbook.Sa veToFile("formula_output.xlsx", ExcelVersion.Version2010)
workbook.Dispose()
这里的关键点不是 =SUM(ScoreRange) 这条公式本身,而是命名范围把“数据位置”从公式中剥离了出来。将来如果分数区域从 B10:B12 变成了别的位置,只要更新 RefersToRange,公式逻辑本身无需修改。
删除前要注意什么,以及几个实用规则
命名范围也可能随着模板演进变成历史包袱,因此清理操作同样重要。不过删除之前,最好先确认是否还有公式依赖它。

按索引或名称删除
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
# 按索引删除
workbook.NameRanges.RemoveAt(0)
# 按名称删除
workbook.NameRanges.Remove("SalesData")
workbook.Sa veToFile("output.xlsx", ExcelVersion.Version2010)
workbook.Dispose()
无论按索引还是按名称删除,本质上都是从工作簿的命名范围集合中移除定义。区别只在于你是基于位置处理,还是基于明确名称处理。
删除风险与命名建议
一旦删除某个命名范围,所有引用该名称的公式都可能报错。因此在批量清理前,最好先盘点相关依赖,尤其是共享模板、自动生成报表和财务计算类文件。
另外,命名时也建议遵守几条基本规则:
- 名称不能包含空格,不能以数字开头,也不能与单元格地址如
A1重名。 - 可以使用驼峰或下划线命名,例如
SalesData、sales_data。 - 如果只在单张工作表内使用,优先采用工作表级命名范围,减少全局冲突。
- 当数据行数经常变化时,可通过代码重新设置
RefersToRange,让命名范围跟着数据区动态更新。
从维护成本来看,命名范围最适合放在这些场景里:公式需要长期复用、数据区域会变、多人协作维护模板,或者需要用脚本对固定业务区域做批量处理。
总结
Excel 命名范围的本质,是把原本难以辨认的单元格地址转换成可读、可维护的业务标识。配合 Python 和 Spire.XLS,可以把创建、查询、修改、格式处理、公式引用和删除这些动作都纳入自动化流程。
如果你的 Excel 脚本已经开始出现大量地址硬编码,或者模板经常因为区域调整而连带修改公式,那么优先引入命名范围,通常会比继续堆叠坐标引用更容易维护。尤其在批量报表、共享模板和持续迭代的数据文件里,它能明显降低后期改动成本。









