自動化不知如何引數化(二)?xlrd來幫你解決
在昨天的博文中介紹了普通單元格資料的獲取,以及單元格資料型別的轉換,詳細見博文:自動化不知如何引數化(一)?xlrd來幫你解決。
昨天的那篇博文中,還有個獲取合併單元格資料的問題沒解決,今天就專門來講一講這個合併單元格資料的獲取。
合併單元格概念
xlrd中提供了一個獲取合併單元格的命令,如下:
meger_cell = sheet_object.merged_cells
我們通過這行命令,執行下,看下是個什麼內容,列印結果如下所示:
從結果可以看出,這是一組座標,但代表的是什麼含義呢?我們結合excel資料內容來看,如下圖所示:
這樣來看的話,是不是就要清晰很多了。注意一下:xlrd庫中,所有的座標,都是從0開始的,同陣列下標一樣,接下來的博文內容中,都會講到座標,所以在這裡統一注意下。
可能有博友又有疑問了,合併單元格中的4個座標代表的什麼意思?不著急,馬上就講解。
比如座標(1,4,0,1),我們把座標看作為(行起始位,行結束位,列起始位,列結束位)。再來對應檢視,座標1代表的就是第二行;座標4代表的就是第五行;座標0代表是第一列;座標1代表的是第二列。
結合上述描述,博友們是不是很清楚了。細心的博友應該已經發現了一個規律,那就是:起始位的座標是包含關係,而結束位的座標是不包含的關係。所以,座標(1,4,0,1)實際取的資料就是,第二行到第四行和第一列合併的資料。這就剛好與【搜尋測試】合併單元格相匹配了。我相信,現在博友們已經明白合併單元格的座標概念了。是不是很簡單,也就那麼回事,是吧。
程式碼實踐
獲取合併單元格資料
我們將上述分析的邏輯,轉換成程式碼,如下所示:
row_index = 2 col_index = 6 for(rlow, rhight, clow, chight) in meger_cell: if(row_index >= rlow and row_index < rhight): if(col_index >= clow and col_index < chight): cell_value = sheet_object.cell_value(rlow, clow) print(cell_value)
上述程式碼,就是將(行起始位,行結束位,列起始位,列結束位)進行了一個比較,並獲取資料,執行程式碼,結果展示如下:
讀取合併&單個單元格資料
如上所示程式碼,有個缺陷,只能讀取合併單元格的資料,可用性還是不高,那如何能做到既能讀取合併單元格資料,又能讀取到單個單元格資料呢。我們來看程式碼,如下所示:
def get_meger_cell_value(row_index, col_index): cell_value = None for(rlow, rhight, clow, chight) in meger_cell: if(row_index >= rlow and row_index < rhight): if(col_index >= clow and col_index < chight): cell_value = sheet_object.cell_value(rlow, clow) break else: cell_value = sheet_object.cell_value(row_index, col_index) else: cell_value = sheet_object.cell_value(row_index, col_index) return cell_value print(get_meger_cell_value(0, 0))
如果博友們不懂獲取資料邏輯,打個斷點,除錯程式碼即可,如下所示:
這樣來看,是不是就很清楚了。上述程式碼,既能獲取合併單元格的資料,又能獲取單個單元格的資料。
以上就是解決獲取合併單元格資料的方法了,希望對博友們有