使用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]的元素 – 它们表示rowxlorowxhicolxlocolxhi 。 做另一个范围相同的事情,然后你可以相交“手动”。

请注意调用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_textstring或检查formula_text的源代码,看看你是否可以修复它:-)

示例脚本xlrdnameAPIdemo.py给出了一些更多的解释,例如关于如何查找特定作用域/工作表中的命名范围。