使用xlrd在Python中访问Excel电子表格的命名范围的交集的值?
在Excel VBA中,可以使用Intersect函数返回一个范围对象,它是参数的交集。 然后你可以像这样得到一个值。
Intersection("Name1", "Name2").Value
在一个标准的单元格公式中,你可以做同样的事情:
=Name1 Name2
我如何使用xlrd完成此操作? 我试过阅读Name类和area2d类似于我将要使用的内容,但是我不知道如何将它们结合在一起。
据我所知, xlrd
本身并不支持这种交集function。 对于你所描述的矩形范围,你可以很容易地使用Name
类来计算相交,就像你自己已经build议的一样。
我在Python 2.7.2
使用的xlrd-0.9.0
发行版有一个目录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'
你可以parsing最后的结果来获得你的范围内的单元格的矩形,或者使用由area2d()
函数返回的元组[1:5]
的元素 – 它们表示rowxlo
, rowxhi
, colxlo
和colxhi
。 做另一个范围相同的事情,然后你可以相交“手动”。
请注意调用name_and_scope_map.get()
的小写名称'sales'
。 这是必需的,因为Excel不具有区分大小写的范围名称。 -1
参数表示应在全部页面上search名称。
如果以较新的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'
在这种情况下,我还没有find任何方式通过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'
所以看起来你需要parsingformula_text
string或检查formula_text
的源代码,看看你是否可以修复它:-)
示例脚本xlrdnameAPIdemo.py
给出了一些更多的解释,例如关于如何查找特定作用域/工作表中的命名范围。