Excelopenpyxl 关键字调用封装

发布时间 2023-09-09 21:50:46作者: 曾焮
import openpyxl, os
from PythonUI自动化.keywords_关键字驱动.综合.common import WebUIKeys, log
from openpyxl.styles import Font, PatternFill

# log = Logs().logger()
class excelOption():
    # 获取 Excel 文件
    def __init__(self, file_path=None):
        if file_path is None:
            self.file_path = os.path.dirname(os.getcwd()).replace('\\', '/') + '/综合/WebUICase.xlsx'
        else:
            self.file_path = file_path
        self.op_excel = self.open_excel(self.file_path)

    # 打开 Excel 表格
    def open_excel(self, file_path):
        # 读取 Excel 文件
        excel = openpyxl.load_workbook(file_path)
        return excel

    # # 获取到表格中的 sheets 页
    def get_sheets(self):
        files = self.op_excel
        sheets = files.sheetnames
        return sheets

    # 读取指定的 sheet 页
    def get_sheet(self, sheet_name=None):
        if sheet_name == None:
            sheet = self.op_excel['盛世明德登录']
        else:
            sheet = self.op_excel[sheet_name]
        return sheet

    # 读取 sheet 页中的所有值
    def get_sheet_values(self):
        values = self.get_sheet().values
        return values

    # 读取表格中的内容


# 表头: 0 编号 1 事件 2定位方法    3元素路径    4输入内容    5描述    6预期将结果    7实际结果
    def write_excel(self, value, sheet, row):
        # 加粗
        bold = Font(bold=True)
        # 填充表格颜色 绿色
        if value == 'pass':
            fill = PatternFill('solid', fgColor='AACF91')
        elif value == 'false':  # 红色
            fill = PatternFill('solid', fgColor='FF0000')
        else:
            pass
        # 指定 x行x列的单元格大写,字体加粗变色
        sheet.cell(row=row, column=8).value = value.upper()
        sheet.cell(row=row, column=8).fill = fill
        sheet.cell(row=row, column=8).font = bold
        # 保存和关闭表格
        self.op_excel.save(self.file_path)
        self.op_excel.close()

    # 对每行的单元格的值进行字典对应
    def format_data(self, event, type, value, text, description, expect):
        # 创建字典, 指定键, 对应值为空
        dictDefault = dict.fromkeys(('event', 'type', 'value', 'text', 'description', 'expect'))
        dictDefault['事件'] = event
        dictDefault['type'] = type
        dictDefault['value'] = value
        dictDefault['text'] = text
        dictDefault['description'] = description
        dictDefault['expect'] = expect
        return dictDefault
    #
    def assert1(self):
        # excel 读取指定 sheet 页
        sheet = self.get_sheet()
        # 遍历 sheet 页的数据
        for value in sheet.values:
            # 如果 第一列 的数据类型是int,
            if type(value[0]) is int:
                # 将 表格单行的值 赋值给字典
                dictDefault = self.format_data(value[1], value[2], value[3], value[4], value[5], value[6])
                # 判断 事件类型, 如果是打开浏览器, 仅传入 dictDefault['text'] 的数据, 打印日志读取备注信息作为当前执行描述
                if value[1] == 'open_browser':
                    log.info(f'自动化执行中,当前执行: {value[5]}')
                    wk = WebUIKeys(value[4])
                # 如果 事件类型的值包含 assert, 调用函数并读取输入的值,获取返回值给到 status
                elif 'assert' in value[1]:
                    log.info(f'自动化执行中,当前执行: {value[5]}')
                    status = getattr(wk, value[1])(**dictDefault)
                    # 将值变色,加粗,大写后 写入 指定行 第8列单元格
                    self.write_excel(status, self.get_sheet(), value[0]+1)
                else:
                    # 其他 均按默认调用,根据需要的数据数量自动传入数据
                    log.info(f'自动化执行中,当前执行: {value[5]}')
                    getattr(wk, value[1])(**dictDefault)
            else:
                pass

if __name__ == '__main__':
    f = excelOption()
    f.assert1()