使用openpyxl访问特定作用域的命名范围

问题描述 投票:2回答:2

如何使用 openpyxl 访问具有特定范围的命名范围?我有一个Excel工作簿,其中有几个工作表,它们的命名范围具有相同的名称。

enter image description here

如果我尝试使用 get_named_range 函数,但它不一定会返回正确的范围,并引发一个异常,例如

>>> 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.orgenlatestapiopenpyxl.worksheet.html?highlight=get_named_range#openpyxl.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')
python openpyxl
2个回答
1
投票

目前openpyxl对NamedRanges的支持很差,唯一的解决方案是做一些像你所做的事情。正确的解决方案应该是改进openpyxl的处理方式,使 "定义名称"。欢迎贡献 请看 https:/bitbucket.orgopenpyxlopenpyxlissue446openbook-delete-sheet-save-bookresults。 以了解更多详情。


0
投票

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

如果你正在寻找基于定义的名称的范围(即不是全局范围)的范围,那么在这个例子中,你正在寻找范围为 "住宅损害 "的 "MCM "范围。

您可以利用 get(name, scope) 办法 https:/openpyxl.readthedocs.ioenstableapiopenpyxl.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)

希望能帮到你!

© www.soinside.com 2019 - 2024. All rights reserved.