Python xlrd命名范围值

在Python中使用XLRD从Excel读取。

简单的情况。 我有一个值的单元格,这是与一个命名的范围相关联。

NamedRange“Foo”= Sheet1!$ A $ 1 A1中的值是“Bar”

book =xlrd.open_workbook("") rng = book.name_map['foo'][0] # lower case for some reason. print rng.??? # how to print the cell value bar?? 

我只想在python代码中引用命名范围“Foo”并打印出单元格的值“Bar”。

编辑:这是另一个更完整的例子:

 import xlrd workbook = xlrd.open_workbook('/path/to/metester.xls') cell_obj = workbook.name_and_scope_map.get(('sales', -1)) # this does print Sheet1!$A$1 print cell_obj.formula_text # this raises the NoneTypeError print cell_obj.cell() 

formula_text是为了确保excel可以读取文件。 在我的情况下,命名的单元格是Sheet1,单元格A1中的“销售”。

返回:

 Sheet1!$A$1 Traceback (most recent call last): File "tester.py", line 7, in <module> print cell_obj.cell() File "/usr/local/lib/python2.7/dist-packages/xlrd/book.py", line 253, in cell self.dump(self.book.logfile, AttributeError: 'NoneType' object has no attribute 'logfile' 

首先,xlrd模块信息( https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966 )中解释为小写。

name_map [#]

从lower_case_name到Name对象列表的映射。 该列表按照作用域顺序sorting。 通常,列表中将有一个项目(全局范围)。

你有两个select。 如果你真的只为一个单元格设置一个名字,那么你可以使用Name类的'cell'方法(参见文档):

 import xlrd book = xlrd.open_workbook("") Name = book.name_map['foo'][0] print(Name.cell()) 

安慰:

 text:'Bar' 

但是,如果您已经命名了整个范围的值,则需要使用Name类的area2d方法:

 import xlrd book = xlrd.open_workbook("q1.xls") Name = book.name_map['foo'][0] Sheet, rowxlo, rowxhi, colxlo, colxhi = Name.area2d() for i in range(rowxhi): print(Sheet.cell(i,0)) 

安慰:

 text:'Bar' 

最初的问题和例子完全由@jonnybazookatone答案回答下面 。 扩展的例子是一个不同的错误。 这似乎是xlrd缺乏,但我已经为你想要的黑客解决scheme。 首先是解释,最后一节是黑客。

说明

查看更多扩展的示例,错误消息是由处理Name对象上的错误条件的代码行生成的,因为由于某些原因而导致评估Name范围中的公式的结果失败。

实际报告的错误

 AttributeError: 'NoneType' object has no attribute 'logfile' 

是次要错误 – 指示self.book对此Name对象评估为None

其次 – 你错过了一个重要的细节,我想,你的Excel文件是.xlsx格式。 注意尾部的x。 在正常的xlsparsing器中,Name对象没有一个属性formula_text ,所以你的代码失败,出现以下错误。

 Traceback (most recent call last): File "D:\q1.py", line 16, in <module> print cell_obj.formula_text AttributeError: 'Name' object has no attribute 'formula_text' 

请注意你的代码示例 – 我花了一段时间来跟踪这个差异xlrd文件被xlrd完全不同的代码parsing。 随着xlsx修复,我可以重现你的错误。

在这种情况下, formula_text属性只是将RC表示法引用给您命名范围的单元格。 需要注意的是,设置formula_text的函数是在2012年xlsx模块的初始提交之后的"#### UNDER CONSTRUCTION ####"

问题是 – 据我所知,公式从未在xlsx打开过程中进行过评估 – 所以您遇到Name.res为None的错误,因此您会看到您的错误。 这似乎是一个xlrd错误/function。

我已经想出了一个讨厌的破解,通过扩展单元格引用,在你的范围是单个单元格的情况下,将做你想要的。 请注意,对于指定多个单元格的命名区域,它将会失败,但可以很容易地进行修改以应对这种情况:

 hack = cell_obj.formula_text (sheetName,ref) = hack.split('!') (discard,colStr,rowStr) = ref.split('$') col = 0 for i in range(len(colStr)): colAdd = string.ascii_uppercase.index(colStr) col += colAdd * 10**i row = int(rowStr)-1 print("Trying to evaluate cell",row,col,"in sheet",sheetName) print workbook.sheet_by_name(sheetName).cell(row,col)