1. 程式人生 > >自動化不知如何引數化(二)?xlrd來幫你解決

自動化不知如何引數化(二)?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))

如果博友們不懂獲取資料邏輯,打個斷點,除錯程式碼即可,如下所示:

這樣來看,是不是就很清楚了。上述程式碼,既能獲取合併單元格的資料,又能獲取單個單元格的資料。

以上就是解決獲取合併單元格資料的方法了,希望對博友們有