使用xlrd在Python中访问Excel电子表格的命名范围的交集值?

时间:2013-04-10 22:18:16

标签: python excel xlrd

在Excel VBA中,您可以使用Intersect函数,该函数返回作为参数交集的范围对象。然后你可以从中获得一个值。

Intersection("Name1", "Name2").Value

在标准单元格公式中,您可以执行相同的操作:

=Name1 Name2

如何使用xlrd完成此操作?我试过通过Name类阅读,而area2d看起来就像我将要使用的那样,但我不知道如何将它们组合在一起。

1 个答案:

答案 0 :(得分:1)

据我所知,xlrd本身并不支持这种交叉功能。对于您描述的各种矩形范围,您可以使用Name类轻松地计算交点,就像您已经建议的那样。

我与xlrd-0.9.0一起使用的Python 2.7.2发行版有一个目录examples,用于说明如何使用命名范围。它附带文件namesdemo.xls,它是旧版Excel(即版本97-2004)的工作簿。

使用该文件确定名为Sales的范围内的单元格的示例如下:

>>> import xlrd
>>> book=xlrd.open_workbook('namesdemo.xls')
>>> nameObj = book.name_and_scope_map.get(('sales', -1))
>>> nameObj.area2d()[1:5]
(1, 2, 1, 14)
>>> nameObj.result.text
u'Sheet3!$B$2:$N$2'

您可以解析最后一个结果以获取范围内的单元格矩形,或者使用[1:5]函数返回的元组中的元素area2d() - 它们代表rowxlo,矩形的rowxhicolxlocolxhi。对另一个范围执行相同的操作然后您可以将它们交叉并且#34;手动"。

请注意'sales'调用中的小写名称name_and_scope_map.get()。这是必需的,因为Excel没有区分大小写的范围名称。 -1参数表示它应该在所有工作表上全局搜索名称。

如果以较新的Excel .xlsx格式保存,则Name对象的行为似乎略有不同:

>>> book=xlrd.open_workbook('namesdemo.xlsx')
>>> nameObj = book.name_and_scope_map.get(('sales', -1))
>>> nameObj.formula_text
u'Sheet3!$B$2:$N$2'

在这种情况下,我找不到任何通过area2d()访问任何实际坐标的方法:

>>> nameObj.area2d()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/xlrd/book.py", line 291, in area2d
    self.dump(self.book.logfile,
AttributeError: 'NoneType' object has no attribute 'logfile'

所以看起来您需要解析formula_text字符串或查看xlrd的源代码,看看是否可以修复它: - )

示例脚本xlrdnameAPIdemo.py提供了更多解释,例如关于如何在特定范围/工作表中查找命名范围。