使用 openpyxl 访问具有特定范围的命名范围
Accessing named ranges with a particular scope using openpyxl
如何使用 openpyxl
访问具有特定范围的命名范围?我有一个包含多个工作表的 Excel 工作簿,这些工作表具有相同名称的命名范围。
如果我尝试在工作表上使用 get_named_range
函数,它不一定 return 是正确的范围,并会引发异常。例如
>>> from openpyxl import load_workbook
>>> wb = load_workbook(filename='database.xlsx')
>>> wb['Residential Damages'].get_named_range('MCM')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python27\lib\site-packages\openpyxl\worksheet\worksheet.py", line 480, in get_named_range
raise NamedRangeException(msg)
openpyxl.exceptions.NamedRangeException: Range $B:$B is not defined on worksheet Residential Damages
(在上述错误中发生的是 returned 范围是针对 "Non-Residential Damages" 电子表格)
我编写了一个可以 return 正确范围的函数,但它效率低下,因为它涉及遍历工作簿中的所有范围。有更好的方法吗?
def get_named_range(workbook, sheet_name, range_name):
sheet_names = wb.get_sheet_names()
named_ranges = wb.get_named_ranges()
for named_range in named_ranges:
scope_name = sheet_names[int(named_range.scope)]
if scope_name == sheet_name:
if range_name == named_range.name:
return named_range
raise KeyError('Named range not found')
我知道这已经很晚了,但希望这个答案可以帮助面临同样问题的其他人。
如果您希望根据范围有限(即非全局范围)的已定义名称获取范围。那么在此示例中,您正在寻找范围为 [=24= 的 "MCM" 范围])
您可以使用get(name, scope)
方法https://openpyxl.readthedocs.io/en/stable/api/openpyxl.workbook.defined_name.html?highlight=localnames#openpyxl.workbook.defined_name.DefinedNameList.localnames
所以在你的问题中你可以这样做:
import openpyxl
wb = load_workbook(filename='database.xlsx')
#You would have to find the sheet ID,
sheetID = wb.sheetnames.index("Residential Damages")
#Finally the range
rng = wb.defined_names.get('MCM', sheetid)
希望对您有所帮助!
如何使用 openpyxl
访问具有特定范围的命名范围?我有一个包含多个工作表的 Excel 工作簿,这些工作表具有相同名称的命名范围。
如果我尝试在工作表上使用 get_named_range
函数,它不一定 return 是正确的范围,并会引发异常。例如
>>> from openpyxl import load_workbook
>>> wb = load_workbook(filename='database.xlsx')
>>> wb['Residential Damages'].get_named_range('MCM')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python27\lib\site-packages\openpyxl\worksheet\worksheet.py", line 480, in get_named_range
raise NamedRangeException(msg)
openpyxl.exceptions.NamedRangeException: Range $B:$B is not defined on worksheet Residential Damages
(在上述错误中发生的是 returned 范围是针对 "Non-Residential Damages" 电子表格)
我编写了一个可以 return 正确范围的函数,但它效率低下,因为它涉及遍历工作簿中的所有范围。有更好的方法吗?
def get_named_range(workbook, sheet_name, range_name):
sheet_names = wb.get_sheet_names()
named_ranges = wb.get_named_ranges()
for named_range in named_ranges:
scope_name = sheet_names[int(named_range.scope)]
if scope_name == sheet_name:
if range_name == named_range.name:
return named_range
raise KeyError('Named range not found')
我知道这已经很晚了,但希望这个答案可以帮助面临同样问题的其他人。
如果您希望根据范围有限(即非全局范围)的已定义名称获取范围。那么在此示例中,您正在寻找范围为 [=24= 的 "MCM" 范围])
您可以使用get(name, scope)
方法https://openpyxl.readthedocs.io/en/stable/api/openpyxl.workbook.defined_name.html?highlight=localnames#openpyxl.workbook.defined_name.DefinedNameList.localnames
所以在你的问题中你可以这样做:
import openpyxl
wb = load_workbook(filename='database.xlsx')
#You would have to find the sheet ID,
sheetID = wb.sheetnames.index("Residential Damages")
#Finally the range
rng = wb.defined_names.get('MCM', sheetid)
希望对您有所帮助!