(1) openpyxl库:pip install openpyxl
(2)作用:针对.xlsx格式的excel进行读取和编辑
II.excel的读写操作
(1)excel读写步骤
-
-
打开工作簿: wb = openpyxl.load_workbook("文件名")
- 选中表单: sheet = wb["表单名"]
- 读取数据
- 读取位置 : sheet.cell(行,列)
- 读取单元格值: sheet.cell(行,列).value
- 写入数据: sheet.cell(row=,column=,value=“字符串类型数据”)
- 写入内容后,要保存才可以生效: wb.save("文件名“)
- 注意:写入时,文件必须关闭,否则报错
- 获取最大行数: max_row = sheet.max_row
- 获取最大列数: max_column = sheet.max_column
-
(2)excel的读写操作
from openpyxl import load_workbook class DoExcel: def __init__(self,filename,sheet_name): """ 初始化方法 :param filename: excel文件路径 :param sheet_name: 表单名称 """ self.filename = filename self.sheet_name = sheet_name def open_excel(self): """打开工作薄,选中表单""" self.wb = load_workbook(self.filename) self.sh = self.wb[self.sheet_name] # 获取最大行,最大列 self.max_row = self.sh.max_row self.max_col = self.sh.max_column def read_data(self): # 读取方法1 """读取数据的方法""" # 1.打开工作薄,选中表单 self.open_excel() # 方法1:[{用例1},{用例2}...] cases = [] for row in range(2,self.max_row+1): case = {} for col in range(1,self.max_col+1): key = self.sh.cell(1,col).value value = self.sh.cell(row,col).value case[key] = value cases.append(case) return cases def read_data_toexcel2(self): # 读取方法2 self.open_excel() # 获取所有的单元格对象 rows = list(self.sh.rows) # 获取标题行:第一行 title = [] for cell in rows[0]: title.append(cell.value) cases = [] # 遍历测试用例行:除了标题的其他行 for row in rows[1:]: # 按行遍历 case = [] for cell in row: case.append(cell.value) # 将单元格中的数据添加到case中 case_dict = dict(zip(title,case)) # 将title,case打包成字典格式:{标题:单元格数据} cases.append(case_dict) # 将所有case加载到cases return cases def read_data_toexcel3(self): # 列表-对象格式:[对象1,对象2...] (获取属性值:对象.属性) self.open_excel() # 获取所有的单元格对象 rows = list(self.sh.rows) # 获取标题行:第一行 title = [] for cell in rows[0]: title.append(cell.value) cases = [] # 遍历测试用例行:除了标题的其他行 for row in rows[1:]: # 按行遍历 case = [] # 创建空列表,用例存储该行的数据 for cell in row: case.append(cell.value) # 将单元格中的数据添加到case中 case_list = list(zip(title, case)) # 将title,case打包成列表元组格式[(属性,属性值)] case_obj = CaseData() # 创建一个对象,用来保存该行用例数据 for key,value in case_list: # 遍历列表中该行用例数据,使用setattr设置对象的属性和属性值(元组拆包) setattr(case_obj,key,value) # print(case_obj.__dict__) cases.append(case_obj) # 将对象加载到cases列表中 return cases def read_data_toexcel4(self): # [{}] 生成器读取excel数据为列表字典格式 self.open_excel() rows = self.max_row + 1 cols = self.max_col + 1 cases = ({self.sh.cell(1, j).value: self.sh.cell(i, j).value for j in range(1, cols)} for i in range(2, rows)) return list(cases) def read_data_toexcel5(self): # 生成器:调用需要转成list格式:list(cases) self.open_excel() header = [] cases = [] # 1张表单的全部测试数据 for row in range(2, self.max_row + 1): # 行遍历,1行即1条测试用例数据,存在1个字典中 case = {} for col in range(1, self.max_col + 1): # 列遍历,列表中存储多条测试用例 # 方法1:比方法2更简洁 case[self.sh.cell(1, col).value] = self.sh.cell(row, col).value # 方法2 # header.append(self.sh.cell(1, col).value) # 读取excel标题行 # case[header[col - 1]] = self.sh.cell(row, col).value # 测试用例数据以{标题行:测试数据存储},注意:标题行存在[]中,以0开始 yield case # 相当于cases.append(datas_dict) def write_data(self,row,column,value): # 打开工作薄 self.open_excel() # 写入数据 self.sh.cell(row=row,column=column,value=value) # 保存文件 self.wb.save(self.filename) # 关闭工作薄 self.close_excel() def close_excel(self): self.wb.close() # 可加可不加,加了可释放内存 class CaseData: pass if __name__ == '__main__': cases = DoExcel(r"D:WorksAPI_Framedataapicases.xlsx","register").read_data_toexcel3() print(cases)
(3)测试用例-回写测试结果
-
Excel封装类中的写入方法: 调用 DoExcel(filename,sheet_name).write_data(row,column,value)
-
用异常捕捉try【回写时,行的值通过case_id定位
try: self.assertEqual(expected, result) except AssertionError as e: self.excel.write_data(row = case_id +1, column = 5, value = 'Fail') raise e else: self.excel.write_data(row = case_id + 1, column = 5, value = 'Pass')