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




