使用openpyxl访问具有特定范围的命名范围

时间:2015-04-08 14:40:25

标签: python openpyxl

如何使用openpyxl访问具有特定范围的命名范围?我有一个包含多个工作表的Excel工作簿,这些工作簿具有相同名称的命名范围。

enter image description here

如果我尝试在工作表上使用get_named_range函数,则不一定返回正确的范围,并引发异常。 e.g。

>>> 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$3:$B$17 is not defined on worksheet Residential Damages

(上述错误中发生的情况是,返回的范围是“非住宅损坏”电子表格)

https://openpyxl.readthedocs.org/en/latest/api/openpyxl.worksheet.html?highlight=get_named_range#openpyxl.worksheet.worksheet.Worksheet.get_named_range

我编写了一个可以返回正确范围的函数,但它效率很低,因为它涉及遍历工作簿中的所有范围。有更好的方法吗?

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')

2 个答案:

答案 0 :(得分:1)

目前在openpyxl中对NamedRanges的支持很差,唯一的解决方案就是做一些像你所做的事情。正确的解决方案是改进openpyxl的处理,以便定义名称&#34;。欢迎捐款!有关详细信息,请参阅https://bitbucket.org/openpyxl/openpyxl/issue/446/open-book-delete-sheet-save-book-results

答案 1 :(得分:1)

我知道这已经很晚了,但是希望这个答案可以帮助其他面临相同问题的人。

如果您要根据限定范围(即非全局范围)的已定义名称获取范围,那么在此示例中,您要查找范围为“住宅损害”的“ 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)

希望这会有所帮助!