from collections import namedtuple
from openpyxl import load_workbook
# 1.如何将一些操作(Excel读写)进行封装?(写出封装的思路)
# a、加载excel文件,定位表单;
# b、定位单元格,读取所有用例数据;
# c、遍历所有单元格数据,或使用ddt;
# d、写入指定单元格数据,保存excel文件;
class ReadExcelData(object):
"""封装读取excel表单数据的工具类"""
def __init__(self, file_path, sheet_name=None):
"""
初始化openpy加载excel文件
定位表单及初始化参数
"""
self.file_path = file_path
self.sheet_name = sheet_name
# 打开已存在Excel文件
self.wb = load_workbook(self.file_path) #打开指定的excel
# 定位表单
self.ws = self.wb[self.sheet_name] if self.sheet_name is not None else self.wb.active # 获取第一个表单
self.sheet_head_tuple = tuple(self.ws.iter_rows(max_row=self.ws.min_row, values_only=True))[0]
self.cases_list = [] # 定义一个存放元组的对象
self.Cases = namedtuple("cases", self.sheet_head_tuple) # 创建一个命名元组类
def get_all_cases(self):
"""
获取excel所有测试用例
"""
for tuple_data in self.ws.iter_rows(min_row=self.ws.min_row + 1, values_only=True): # 每次遍历,返回由某行所有单元格值组成的一个元组
self.cases_list.append(self.Cases(*tuple_data))
return self.cases_list
def get_one_case(self, row):
"""
获取一条case
:return一个case对象
"""
if isinstance(row, int) and (self.ws.min_row + 1 <= row <= self.ws.max_row):
return tuple(self.ws.iter_rows(min_row=row, max_row=row, values_only=True))[0]
else:
print("传入行号不正确,应为大于1的整数!")
def write_file(self, row, actul_result, result_status):
'''
执行用例结果写入excel,并保存
'''
if isinstance(row, int) and (self.ws.min_row + 1 <= row < self.ws.max_row):
self.ws.cell(row=row, column=self.ws.max_column - 1, value=actul_result)
self.ws.cell(row=row, column=self.ws.max_column, value=result_status)
self.wb.save(self.file_path)
else:
print("处理失败!")
if __name__ == '__main__':
file_path = u'E:\heguanghua\python\接口自动化\api.xlsx'
sheet_name = 'Sheet1'
res = ReadExcelData(file_path,sheet_name).get_all_cases()
print(res)
print('================================================')
re = ReadExcelData(file_path,sheet_name).get_one_case(2)
print(re)