在Excel VBA中,可以使用Intersect函數,該函數返回參數交集的範圍對象。然後你可以像這樣獲得價值。使用xlrd訪問Python中Excel電子表格的命名範圍的交集值?
Intersection("Name1", "Name2").Value
在一個標準的單元格公式,你可以做同樣的事情:
=Name1 Name2
如何做到這一點使用xlrd?我試過閱讀Name類和area2d類似於我將要使用的內容,但我不知道如何將這一切結合在一起。
在Excel VBA中,可以使用Intersect函數,該函數返回參數交集的範圍對象。然後你可以像這樣獲得價值。使用xlrd訪問Python中Excel電子表格的命名範圍的交集值?
Intersection("Name1", "Name2").Value
在一個標準的單元格公式,你可以做同樣的事情:
=Name1 Name2
如何做到這一點使用xlrd?我試過閱讀Name類和area2d類似於我將要使用的內容,但我不知道如何將這一切結合在一起。
據我所知,xlrd
本身並不支持這種交集功能。對於您所描述的各種矩形範圍,您可以使用Name
類相當輕鬆地計算交叉點,就像您自己已經建議的那樣。
與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'
您可以分析最後的結果獲得細胞的矩形範圍,或者使用元素[1:5]
由area2d()
函數返回的元組 - 它們表示矩形的rowxlo
,rowxhi
,colxlo
和colxhi
。對另一個範圍做同樣的事情,然後你可以「手動」地交叉它們。
請在name_and_scope_map.get()
的電話中注意小寫字母'sales'
。這是必需的,因爲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-11 05:12:43
它們是矩形的。出於我的目的,它們是高度上的一行和寬度上的多列,或者一列寬和多行高。我關心的唯一交點是每個交叉點中只有一個單元交叉並相交。 – mandroid 2013-04-11 20:50:00