1

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

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

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

=Name1 Name2

如何使用 xlrd 完成此操作?我已经尝试通读 Name 类,area2d 看起来就像我将要使用的那样,但我不知道如何将它们联系在一起。

4

1 回答 1

1

据我所知,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()——它们表示矩形的rowxlorowxhi和。对另一个范围做同样的事情,然后你可以“手动”将它们相交。colxlocolxhi

'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提供了更多解释,例如关于如何在特定范围/工作表中查找命名范围。

于 2013-04-12T21:31:03.230 回答