读写excel

I.操作excel的工具

(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
    • 按行获取所有的单元格对象,每行的单元格放入一个元组中: list(sheet.rows)

(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')
原文地址:https://www.cnblogs.com/kite123/p/13784608.html