4

在 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'
4

2 回答 2

5

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

name_map [#]

从 lower_case_name 到 Name 对象列表的映射。该列表按范围顺序排序。通常,列表中会有一项(全局范围的)。

你有两个选择。如果您真的只为单个单元格设置名称,那么您使用 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'
于 2015-01-26T01:42:38.087 回答
3

最初的问题和示例由下面的@jonnybazookatone 答案准确回答。扩展示例是一个不同的错误。这对我来说似乎是一个xlrd缺陷,但我已经破解了你想要的解决方案。第一部分是解释,最后一部分是hack。

解释

查看更扩展的示例,错误消息是从处理对象上的错误条件的代码行Name产生的,其中计算范围内的公式的结果由于Name某种原因而失败。

实际报告的错误

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

是次要错误 - 表示该对象的self.book计算结果为。NoneName

其次 - 我认为你错过了一个重要的细节,即你的 Excel 文件是.xlsx格式的。注意尾随的 x。在普通的 xls 解析器中, 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'

请注意您的代码示例 - 我花了一些时间来跟踪差异 -xlsx文件由xlrd. 修复后xlsx,我可以重现您的错误。

在这种情况下,该formula_text属性只是将 RC 符号引用提供给作为您命名范围的单元。应该注意的是,设置的功能formula_text是有问题"#### UNDER CONSTRUCTION ####"的,并且自 2012 年 xlsx 模块的初始提交以来一直存在。

问题是 - 据我所知 - 在打开 xlsx 时永远不会评估公式 - 所以你遇到了Name.resNone 的错误,因此你看到了你的错误。这似乎是一个xlrd错误/功能。

哈克

我想出了一个讨厌的技巧,通过扩展单元格引用,在您的范围是单个单元格的情况下,它可以满足您的需求。请注意,对于像现在这样引用多个单元格的命名范围将失败,但可以轻松修改以应对这种情况:

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)
于 2015-01-27T12:58:36.280 回答