zoukankan      html  css  js  c++  java
  • 读写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')
  • 相关阅读:
    bzoj 1121: [POI2008]激光发射器SZK 思维_结论
    bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流 + 拆点 + 二分
    luogu 3467 [POI2008]PLA-Postering 单调栈
    BZOJ1143: [CTSC2008]祭祀river 网络流_Floyd_最大独立集
    BZOJ 1123: [POI2008]BLO 求割点+乘法原理+计数
    bzoj 1191: [HNOI2006]超级英雄Hero 网络流 + 残量网络
    无题
    numpy模块(对矩阵的处理,ndarray对象)
    python面向过程编程
    logging模块,程序日志模板
  • 原文地址:https://www.cnblogs.com/kite123/p/13784608.html
Copyright © 2011-2022 走看看