天天看點

關于xlrd處理合并單元格

先埋個雷, 最近在做通過excel讀取接口測試用例~

流程等都是自己制定的,打算做完了之後放到GitHub上去哈哈哈。

正式進入正題~

在寫這個架構的時候,遇到了一個問題,就是同一個接口,需要為他準備很多組參數,那麼我該在excel裡怎麼處理呢,本身是想另起一行,但是又覺得同樣的内容過多,比如接口位址、name、id、headers等這些資訊都肯定是一緻的。那麼我想到了,合并單元格!

但是新的問題又出現了,在我合并單元格以後,我逐行讀取用例的時候,發現,被合并的單元格讀取的結果是'',

這就很令人尴尬了。

但是不要緊

def merge_cell(sheet):
    rt = {}
    if sheet.merged_cells:
        # exists merged cell
        for item in sheet.merged_cells:
            for row in range(item[0], item[1]):
                for col in range(item[2], item[3]):
                    rt.update({(row, col): (item[0], item[2])})
    return rt

def get_merged(filename):
    # 這裡本應該做filepath的判斷,但是我先省略了
    book = xlrd.open_workbook(filename)
    sheets = book.sheets()    # 所有sheets
    for index in range(len(sheets)):
        sheet = book.sheet_by_index(index)
        # 擷取合并的單元格
        merged = merge_cell(sheet)
        # 擷取sheet的行數(預設每一行就是一條用例)
        rows = sheet.nrows
        # 如果sheet為空,那麼rows是0
        if rows:
            for row in range(rows):
                data = sheet.row_values(row)   # 單行資料
                for index, content in enumerate(data):
                    if merged.get((row, index)):
                        # 這是合并後的單元格,需要重新取一次資料
                        data[index] = sheet.cell_value(*merged.get((row, index)))           

這樣每行的資料data, 就是正确的資料了!

xlrd裡面有個merged_cells方法,可以擷取到所有合并的單元格~

關于xlrd處理合并單元格

像如圖的,G列2,3,4行都合并到了第2行,是以導緻取3,4行資料的時候會取到"".

我這邊的case_info是每一行的資料,用的row_values()方法取出的資料。

相當于做了1次更新,merge_cell方法是用來擷取哪些單元格是被合并了的,并且找到他們合并到的那個單元格。(已知缺陷,第一行本身就能去到資料,我做了多餘的更新。)

merged是調用merge_cell()方法後傳回的1個dict,裡面存放了key: 被合并的單元格位址, value: 合并到的單元格位址。

這樣就解決了同一個接口, 多參數的問題~

繼續閱讀