在Excel VBA中,您可以使用Intersect函数,该函数返回作为参数交集的范围对象。然后你可以从中获得一个值。
Intersection("Name1", "Name2").Value
在标准单元格公式中,您可以执行相同的操作:
=Name1 Name2
如何使用xlrd完成此操作?我试过通过Name类阅读,而area2d看起来就像我将要使用的那样,但我不知道如何将它们组合在一起。
答案 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
,矩形的rowxhi
,colxlo
和colxhi
。对另一个范围执行相同的操作然后您可以将它们交叉并且#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
提供了更多解释,例如关于如何在特定范围/工作表中查找命名范围。