python基于openpyxl生成excel文件


Posted in Python onDecember 23, 2020

项目需要,需要自动生成PDF测试报告。经过对比之后,选择使用了reportlab模块。 项目背景:开发一个测试平台,供测试维护测试用例,执行测试用例,并且生成测试报告(包含PDF和excel),将生成的测试报告以邮件的形式发送相关人。

excel生成代码如下:

from openpyxl import load_workbook
from openpyxl.styles import Font, Alignment, Side, Border
import shutil

# 生成测试计划的excel文件
class GenerateCaseExcel(object):
  def __init__(self, file_name):
    self.file_name = file_name
    self.file_path = '/xxx/xxx/xxx/'
    self.font_title = Font(name=u"宋体", size=12, bold=True)
    self.font_body = Font(name=u"宋体", size=10)
    self.alignment_center = Alignment(horizontal='center', vertical='center', wrap_text=True)
    self.alignment_left = Alignment(horizontal='left', vertical='center', wrap_text=True)
    self.thin = Side(border_style="thin")
    self.border = Border(top=self.thin, left=self.thin, right=self.thin, bottom=self.thin)

  def generateExcel(self, basic_data, case_set_list, case_data_info):
    shutil.copy(u'/xxx/xxx/xxx/测试用例模板.xlsx', self.file_path + self.file_name + '.xlsx')

    wb = load_workbook(self.file_path + self.file_name + '.xlsx')
    # 综合评估页面
    ws_first = wb.worksheets[0]
    ws_first.cell(2, 2).value = basic_data['project_name']
    ws_first.cell(2, 4).value = basic_data['report_code']
    ws_first.cell(2, 6).value = basic_data['report_date']
    ws_first.cell(3, 2).value = basic_data['task_id']
    ws_first.cell(3, 4).value = basic_data['task_name']
    ws_first.cell(3, 6).value = basic_data['task_owner']

    ws_first.cell(4, 2).value = basic_data['task_priority']
    ws_first.cell(4, 4).value = basic_data['task_status']
    ws_first.cell(4, 6).value = basic_data['task_module']
    ws_first.cell(5, 2).value = basic_data['app_version']
    ws_first.cell(5, 4).value = basic_data['product_id']
    ws_first.cell(5, 6).value = basic_data['device_id']

    ws_first.cell(6, 2).value = basic_data['firmware_key']
    ws_first.cell(6, 4).value = basic_data['firmware_version']
    ws_first.cell(6, 6).value = basic_data['mcu_version']
    ws_first.cell(7, 2).value = basic_data['gateway_version']
    ws_first.cell(7, 4).value = basic_data['chip_module']

    ws_first.cell(8, 2).value = basic_data['task_result']
    ws_first.cell(9, 2).value = basic_data['note']
    ws_first.cell(10, 2).value = basic_data['router']
    ws_first.cell(11, 2).value = basic_data['test_mobile']

    for i in range(8, 12):
      for j in range(2, 7):
        ws_first.cell(i, j).border = self.border

    # 动态生成测试任务用例集信息
    if len(case_set_list) > 0:
      # 合并单元格处理
      merge_num = int(11) + len(case_set_list)
      ws_first.merge_cells("A12:A" + str(merge_num))
      ws_first.cell(12, 1, value="测试流程")
      ws_first.cell(12, 1).alignment = self.alignment_center
      ws_first.cell(merge_num, 1).border = self.border

      for i in range(len(case_set_list)):
        cur_row = int(12) + i
        ws_first.cell(12 + i, 2, value="用例集名称")
        ws_first.cell(12 + i, 2).alignment = self.alignment_center
        ws_first.cell(12 + i, 2).border = self.border
        ws_first.merge_cells("C" + str(cur_row) + ":D" + str(cur_row))
        ws_first.cell(12 + i, 3, value=case_set_list[i]['set_name'])
        ws_first.cell(12 + i, 3).alignment = self.alignment_center
        ws_first.cell(12 + i, 3).border = self.border
        ws_first.cell(12 + i, 4).border = self.border
        ws_first.cell(12 + i, 5, value="用例负责人")
        ws_first.cell(12 + i, 5).alignment = self.alignment_center
        ws_first.cell(12 + i, 5).border = self.border
        ws_first.cell(12 + i, 6, value=case_set_list[i]['set_owner'])
        ws_first.cell(12 + i, 6).alignment = self.alignment_center
        ws_first.cell(12 + i, 6).border = self.border

    # 测试用例集用例详细信息
    fields = "case_id,case_module,case_priority,case_tags,case_name,case_step,expect_result,case_operator,real_result,note".split(",")
    CASE_FIELD_LENGHT = 10
    CASE_FIELD_DES = ["用例编号", "模块", "优先级", "标签", "标题", "测试步骤", "期望结果", "执行人", "实际结果", "备注"]
    COLUMN_DES = {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F', 7: 'G', 8: 'H', 9: 'I', 10: 'J'}
    if len(case_set_list) > 0:
      for i in range(len(case_set_list)):
        # title需要是unicode类型
        ws_name = wb.create_sheet(title=case_set_list[i]['set_name'])
        # 用例第一行初始化
        for j in range(CASE_FIELD_LENGHT):
          ws_name.cell(1, j + 1, value=CASE_FIELD_DES[j])
          if j == 3 or j == 4 or j == 5 or j == 6 or j == 9:
            ws_name.column_dimensions[COLUMN_DES[j + 1]].width = 35
          else:
            ws_name.column_dimensions[COLUMN_DES[j + 1]].width = 10
          ws_name.cell(1, j + 1).font = self.font_title
          ws_name.cell(1, j + 1).alignment = self.alignment_center
          ws_name.cell(1, j + 1).border = self.border
          ws_name.row_dimensions[1].height = 30
        if case_set_list[i]['set_name'] in case_data_info.keys() and len(case_data_info[case_set_list[i]['set_name']]) > 0:
          self.generateTableData(ws_name, case_data_info[case_set_list[i]['set_name']], fields)

    wb.save(filename=self.file_path + self.file_name + '.xlsx')
    wb.close()

  # 生成table规则数据
  def generateTableData(self, sheet_name, data_list, fields):
    row_index = 2
    for data in data_list:
      col_index = 1
      for title in fields:
        sheet_name.cell(row=row_index, column=col_index, value=data[title])
        sheet_name.cell(row=row_index, column=col_index).border = self.border
        sheet_name.cell(row=row_index, column=col_index).font = self.font_body
        sheet_name.row_dimensions[row_index].height = 25
        if col_index == 5 or col_index == 6 or col_index == 7 or col_index == 10:
          sheet_name.cell(row=row_index, column=col_index).alignment = self.alignment_left
        else:
          sheet_name.cell(row=row_index, column=col_index).alignment = self.alignment_center
        col_index += 1
      row_index += 1

生成效果:

python基于openpyxl生成excel文件

python基于openpyxl生成excel文件

以上就是python基于openpyxl生成excel文件的详细内容,更多关于python 生成excel文件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现全局变量的两个解决方法
Jul 03 Python
Python中的异常处理学习笔记
Jan 28 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
Jul 12 Python
Python实现使用卷积提取图片轮廓功能示例
May 12 Python
详解配置Django的Celery异步之路踩坑
Nov 25 Python
python实现二维数组的对角线遍历
Mar 02 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
python 图片去噪的方法示例
Jul 09 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
详解python方法之绑定方法与非绑定方法
Aug 17 Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 #Python
用python计算文件的MD5值
Dec 23 #Python
python中lower函数实现方法及用法讲解
Dec 23 #Python
Python类型转换的魔术方法详解
Dec 23 #Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
Dec 23 #Python
python音频处理的示例详解
Dec 23 #Python
python 实现客户端与服务端的通信
Dec 23 #Python
You might like
php防止SQL注入详解及防范
2013/11/12 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
js使用递归解析xml
2014/12/12 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
在Python中os.fork()产生子进程的例子
2019/08/08 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
Android面试宝典
2013/08/06 面试题
个人优缺点自我评价
2014/01/27 职场文书
小学英语教学反思案例
2014/02/04 职场文书
大专会计自我鉴定
2014/02/06 职场文书
物理教学随笔感言
2014/02/22 职场文书
家长对孩子的评语
2014/04/18 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
学生保证书格式
2015/02/27 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技