You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Openpyxl:如何获取工作簿中所有已定义名称及对应单元格引用

获取Excel工作簿中所有命名区域的名称与引用字符串

嘿,我之前处理过一模一样的需求,用openpyxl就能轻松解决这个问题!你说的wb.defined_names确实返回的是DefinedNameList,但它本身是可迭代的,只是每个元素是DefinedName对象,得主动提取它的属性才能拿到名称和引用信息。

下面给你两种实用的实现方式,按需选择:

方式一:直接获取原始引用字符串

这种方式最简单,直接拿到命名区域定义时的原始引用字符串(比如Sheet1!A1:B10$A$1:$C$5):

from openpyxl import load_workbook

# 加载工作簿,若需读取公式计算后的值可添加data_only=True
wb = load_workbook("你的文件.xlsx")

named_ranges = []

# 遍历所有定义的命名区域
for defined_name in wb.defined_names:
    # 提取命名区域的名称
    range_name = defined_name.name
    # 提取原始的单元格引用字符串
    ref_string = defined_name.value
    named_ranges.append((range_name, ref_string))

# 输出整理后的结果
for name, ref in named_ranges:
    print(f"命名区域名称: *{name}*, 引用: `{ref}`")

方式二:解析为带工作表名的标准引用

如果需要更规整的格式(确保每个引用都明确关联对应工作表),可以用destinations()方法解析,它会返回工作表对象和单元格区域字符串:

from openpyxl import load_workbook

wb = load_workbook("你的文件.xlsx")

named_ranges = []

for defined_name in wb.defined_names:
    range_name = defined_name.name
    try:
        # 处理命名区域(少数情况一个命名会对应多个目标)
        for ws, range_str in defined_name.destinations():
            # 拼接成「工作表名!单元格区域」的标准格式
            full_ref = f"{ws.title}!{range_str}"
            named_ranges.append((range_name, full_ref))
    except TypeError:
        # 兼容非单元格引用的特殊情况(比如命名常量、自定义公式)
        named_ranges.append((range_name, f"[非单元格引用] {defined_name.value}"))

# 查看最终整理结果
for name, ref in named_ranges:
    print(f"*[{name}]* → `{ref}`")

为啥你之前遍历拿不到数据?

你直接遍历wb.defined_names时,看到的可能是DefinedName对象的内存地址,而不是实际数据。必须访问它的.name(名称)、.value(原始引用)或.destinations()(解析后的工作表+区域)属性,才能拿到有用的信息。

内容的提问来源于stack exchange,提问作者ac24

火山引擎 最新活动