2013-04-10 44 views
1

在Excel VBA中,可以使用Intersect函數,該函數返回參數交集的範圍對象。然後你可以像這樣獲得價值。使用xlrd訪問Python中Excel電子表格的命名範圍的交集值?

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

在一個標準的單元格公式,你可以做同樣的事情:

=Name1 Name2 

如何做到這一點使用xlrd?我試過閱讀Name類和area2d類似於我將要使用的內容,但我不知道如何將這一切結合在一起。

+0

您想要與矩形相交的範圍,還是它們可以是任何形狀? – 2013-04-11 05:12:43

+0

它們是矩形的。出於我的目的,它們是高度上的一行和寬度上的多列,或者一列寬和多行高。我關心的唯一交點是每個交叉點中只有一個單元交叉並相交。 – mandroid 2013-04-11 20:50:00

回答

1

據我所知,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,colxlocolxhi。對另一個範圍做同樣的事情,然後你可以「手動」地交叉它們。

請在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給出了一些更多解釋,例如關於如何查找特定作用域/工作表中的命名範圍。