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中pygame的mouse鼠标事件用法实例
Nov 11 Python
python3中int(整型)的使用教程
Mar 23 Python
python分割列表(list)的方法示例
May 07 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
python编程使用协程并发的优缺点
Sep 20 Python
python3 实现验证码图片切割的方法
Dec 07 Python
使用PIL(Python-Imaging)反转图像的颜色方法
Jan 24 Python
基于Python检测动态物体颜色过程解析
Dec 04 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
Django单元测试中Fixtures用法详解
Feb 25 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
Python环境搭建过程从安装到Hello World
Feb 05 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
PR值查询 | PageRank 查询
2006/12/20 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
2019/05/06 Javascript
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
小学生家长评语集锦
2014/01/30 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
推销搭讪开场白
2015/05/28 职场文书
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android