在 Excel VBA 中,您可以使用 Intersect 函数返回一个范围对象,该对象是参数的交集。然后,您可以像这样从中获得价值。
Intersection("Name1", "Name2").Value
在标准单元格公式中,您可以执行相同的操作:
=Name1 Name2
如何使用 xlrd 完成此操作?我已经尝试通读 Name 类,area2d 看起来就像我将要使用的那样,但我不知道如何将它们联系在一起。
据我所知,xlrd
本身并不支持这种交集功能。对于您描述的各种矩形范围,您可以使用Name
该类相当容易地计算交集,就像您已经建议自己一样。
xlrd-0.9.0
我使用的发行版Python 2.7.2
有一个目录examples
,显示如何使用命名范围。它附带的文件namesdemo.xls
是旧版本 Excel 的工作簿(它说 version 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
'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
提供了更多解释,例如关于如何在特定范围/工作表中查找命名范围。