在自動化測試過程中,將測試數據放在excel中形成數據驅動測試框架不失爲一個選擇,xlrd在讀取合併單元格時,認爲合併後的單元格的首格有值,其餘格均爲空,所以需要經過處理,在處理過程中考慮到假如又存在本身單元格內容就是空值的情況,所以需要計算合併的單元格的範圍,在網上經過一番查找,發現了大牛的方法,所以分享下完整的代碼:
數據樣式在網上比較常見,包括了行合併和列合併
# -*- coding:utf-8 -*-
import xlrd
from datetime import date
# 注意在讀取時要添加formatting_info=True參數,默認是False,表示原樣讀取
wb = xlrd.open_workbook('MergeCell.xls', formatting_info=True)
table = wb.sheet_by_name('Sheet1')
# 計算出合併的單元格有哪些
colspan = {} # 用於保存計算出的合併的單元格,key=(7, 4)合併單元格座標,value=(7, 2)合併單元格首格座標
# table.merged_cells是一個元組的集合,每個元組由4個數字構成(7,8,2,5)
# 四個數字依次代表:行,合併的範圍(不包含),列,合併的範圍(不包含),類似range(),從0開始計算
# (7,8,2,5)的意思是第7行的2,3,4列進行了合併
print 'table.merged_cells:' + str(table.merged_cells)
if table.merged_cells:
for item in table.merged_cells:
# print 'item: ' + str(item)
# 通過循環進行組合,從而得出所有的合併單元格的座標
for row in range(item[0], item[1]):
for col in range(item[2], item[3]):
# 合併單元格的首格是有值的,所以在這裏進行了去重
if (row, col) != (item[0], item[2]):
colspan.update({(row, col): (item[0], item[2])})
print colspan
# 開始循環讀取excel中的每一行的數據
for i in range(table.nrows):
for j in range(table.ncols):
# 假如碰見合併的單元格座標,取合併的首格的值即可
if colspan.get((i, j)):
print table.cell_value(*colspan.get((i, j))),
else:
# 對excel中的日期格式進行
if table.cell(i, j).ctype == 3:
date_value = xlrd.xldate_as_tuple(table.cell_value(i, j), wb.datemode)
date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
print date_tmp,
else:
print table.cell_value(i, j),
print '\n'**
運行結果如下:
table.merged_cells:[(7, 8, 2, 5), (1, 3, 4, 5), (3, 6, 4, 5)]
{(7, 4): (7, 2), (7, 3): (7, 2), (5, 4): (3, 4), (4, 4): (3, 4), (2, 4): (1, 4)}
姓名 年齡 出生日期 愛好 關係
小杰 24.0 1991/11/11 打人 好朋友
小胖 24.0 1990/02/22 彈吉他 好朋友
小明 26.0 1989/12/12 打遊戲 同學
大神 26.0 1989/09/09 打遊戲 同學
大仙 27.0 1988/08/08 打遊戲 同學
小敏 25.0 1990/10/10 工作 一個人
無名 20.0 暫無 暫無 暫無