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之编写简单简单连接数据库并执行查询操作
Feb 27 Python
python编码总结(编码类型、格式、转码)
Jul 01 Python
pygame游戏之旅 创建游戏窗口界面
Nov 20 Python
用Python实现大文本文件切割的方法
Jan 12 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
PyTorch中Tensor的数据统计示例
Feb 17 Python
AUC计算方法与Python实现代码
Feb 28 Python
python 实现人和电脑猜拳的示例代码
Mar 02 Python
Python IDLE或shell中切换路径的操作
Mar 09 Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
python 实现客户端与服务端的通信
Dec 23 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
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
JQuery动画和停止动画实例代码
2013/03/01 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
javascript闭包功能与用法实例分析
2017/04/06 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
js实现图片实时时钟
2020/01/15 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
python解析xml文件实例分析
2015/05/27 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
利用Python批量生成任意尺寸的图片
2016/08/29 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
会计实习生工作总结的自我评价
2013/10/07 职场文书
迟到早退检讨书
2014/02/10 职场文书
社区维稳工作方案
2014/06/06 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
社区服务活动感想
2015/08/11 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python