一、简单的插入文本,图片 等
0. 创建表对象,并命名 wb = xlsxwriter.Workbook("**.xlsx") 1. 创建sheet表,并并命名 sheet =wb.add_worksheet("sheetName") 2. 往某个单元格、或者某几个表格写一个文字,或求和表达式 sheet.write(0,0,"2021年度") #格子; 竖,横 sheet.write(7, 2, "=sum(C5:C7)") # C5到C7之间求和 sheet.merge_range(1,0,2,4,"第二季度销售统计") # 左上格子,右下格子
4. 把列表的元素,依次插入某一行(从某个格子写行)--,常用来写入标题 sheet.write_row(3,1,["月份","预期销售额","实际销售额"]) 5. 往格子里写 链接 sheet.write_url(9,0,"http://www.baidu.com",string="百度一下") 6. 往某个格子放图片--图片会超出格子
sheet.insert_image(11,0,"路径/img.png")
代码思路,就是创建一个 表对象,然后新增内容,最后关闭文件
import xlsxwriter # 诶哦思writer
"""
0. 创建表对象,并命名
1. 创建sheet表,并并命名
2. 往某个单元格,写文字
3. 合并单元格,写文字
4. 把列表的元素,依次插入某一行--,常用来写入标题
5. 往格子里写 链接
6. 往某个格子放图片--图片会超出格子
"""
# 1. 创建工作簿对象
wb =xlsxwriter.Workbook("销售统计表.xlsx") # --------------0
# 2. 创建工作表对象
sheet =wb.add_worksheet("第二季度") # --------------1
# 3. 写入数据
sheet.write(0,0,"2021年度") # ——————————2. 前两个参数是 格子
sheet.merge_range(1,0,2,4,"第二季度销售统计") # —————————— 3. 前两个参数是左上格子, 然后是右下角 格子
sheet.write_row(3,0,["月份","预期销售额","实际销售额"]) # -----------4. 前两个参数是列表 的第一个元素要放的
# 表内容
data = [
["四月份",400,350],
["五月份",500,450],
["六月份",600,450]
]
# 计算 (excle公式)
sheet.write(7, 1, "=sum(B5:B7)") # --------------1 文字也可以写 excle计算表达式,如 “B5 ————B7 的总和”
sheet.write(7, 2, "=sum(C5:C7)")
for i,items in enumerate(data): # i表示第几次 emuerate 可以有i
sheet.write_row(i+4,0,items)
# 写入超链接数据
sheet.write_url(9,0,"http://www.baidu.com",string="百度一下") # ----------5
# 写入图片
sheet.insert_image(11,0,"img.png") # 后面是写路径
#4. 关闭文件
wb.close()
文档效果如下:
二、xlsxwriter控制样式:
设置格子样式
方式1 :以字典的形式 (适合用于初始化做模板等)
format1 = wb.add_format({"bold":True}) # 设置样式
sheet.write(0,0,"2021年度",format1) # 使用样式
format1 = wb.add_format({"bold":True})
# 整理如下:
"fg_color": "#808080", # 单元格的背景颜色,灰色
"bold": True, # 字体加粗 也可以写1, 默认为False
"align": "center", # 水平对齐方式
"valign": "vcenter", # 垂直对齐方式
"font_color": "white", # 字体颜色,可以用英语,可以用 色值
"font_size": 18, # 字体大小
"text_wrap": True, # 为True,在格子内自动换行, 为False,在格子内不换行, 默认不换行,但要超出格子
"top": 1, "bottom": 1, "left": 1, "right": 1 , # 设置边框
"italic": True # 斜体,默认为False
方式2:样式调方法单个加,如下 (使用用来修改样式)
format2 =wb.add_format()
format2.set_bold() # 加粗
format2.set_font_color("red") # 字体颜色
format2.set_font_size(15) # 设置字体大小
format2.set_font_name("楷体")
format2.set_align("center") # 设置水平方向居中
format2.set_align("vcenter") # 设置垂直居中
format2.set_bg_color("gray") # 设置背景颜色
使用样式,使用write时,最后一个参数放 样式对象。(如下例子)
merge_range,write_row 同理 最后一个参数,放样式对象
设置行高,列宽(一个或多个)
# 设置列宽 (多列)
sheet.set_column(1,2,30)
# 设置行高 (一行)
sheet.set_row(3,27)
代码和效果如下
"""
样式设置
"""
import xlsxwriter
wb =xlsxwriter.Workbook("销售统计表_有样式的.xlsx")
sheet =wb.add_worksheet("第二季度")
#方式1 :以字典的形式
cell_format = wb.add_format({"bold":True}) # 加粗样式
# 方式2:通过 对象调用方法的方式
cell_format2 =wb.add_format()
cell_format2.set_bold() # 加粗
cell_format2.set_font_color("red") # 字体颜色
cell_format2.set_font_size(15) # 设置字体大小
cell_format2.set_font_name("楷体")
cell_format2.set_align("center") # 设置水平方向居中
cell_format2.set_align("vcenter") # 设置垂直居中
# 设置header样式(多个格子)
header_format1 =wb.add_format()
header_format1.set_bg_color("gray") # 设置背景颜色
header_format1.set_align("center")
header_format1.set_align("vcenter")
# 设置列宽 (多列)
sheet.set_column(1,2,30)
# 设置行高 (一行)
sheet.set_row(3,27)
sheet.write(0,0,"2021年度",cell_format) # 写入单个单元格数据,直接使用write ,格式会默认根据后面值是什么调用对应的方法
cell_format.set_font_color("red") # 有使用第二个方式变红了
sheet.merge_range(1,0,1,2,"第二季度销售统计",cell_format2) # 合并单元格 ,左上角(行,列) 右下角(行,列)
sheet.write_row(3,0,["月份","预期销售额","实际销售额"],header_format1) # 以行的方式写,适用于表头, 写在 (3,0)位置
# 关闭文件
wb.close()
三、生成图表 -柱状图例子
如下,代码,是柱状图的代码
1. 创建图表对象-
类型:柱状图
chart = wb.add_chart({"type":"column"}) # column 柱状图 chart.set_title({"name":"第二季度销售统计"}) # 设置图标名称
2. 图标对象上指定x,y轴取值, 加x y 单位
chart.add_series({
"name":"",
"categories":[],
"values":[]
}) 可以加多个
chart.set_x_axis({"name":"月份"})
chart.set_y_axis({"name":"销售额"})
3.把图表放到sheet对象上
sheet.insert_chart("A12",chart) # 并指定问题
代码如下
"""
写入图表到excel
"""
import xlsxwriter
wb =xlsxwriter.Workbook("销售统计表_写图表的.xlsx")
sheet =wb.add_worksheet("第二季度")
#方式1 :以字典的形式
cell_format = wb.add_format({"bold":True}) # 加粗样式
# 方式2:通过 对象调用方法的方式
cell_format2 =wb.add_format()
cell_format2.set_bold() # 加粗
cell_format2.set_font_color("red") # 字体颜色
cell_format2.set_font_size(15) # 设置字体大小
cell_format2.set_font_name("楷体")
cell_format2.set_align("center") # 设置水平方向居中
cell_format2.set_align("vcenter") # 设置垂直居中
# 设置header样式(多个格子)
header_format1 =wb.add_format()
header_format1.set_bg_color("gray") # 设置背景颜色
header_format1.set_align("center")
header_format1.set_align("vcenter")
# 设置列宽
sheet.set_column(1,2,30)
# 设置行高
sheet.set_row(3,27)
sheet.write(0,0,"2021年度",cell_format) # 写入单个单元格数据,直接使用write ,格式会默认根据后面值是什么调用对应的方法
sheet.merge_range(1,0,1,2,"第二季度销售统计",cell_format2) # 合并单元格 ,左上角(行,列) 右下角(行,列)
sheet.write_row(3,0,["月份","预期销售额","实际销售额"],header_format1) # 以行的方式写,适用于表头, 写在 (3,0)位置
# 表内容
data = [
["四月份",400,350],
["五月份",500,450],
["六月份",600,450]
]
# 计算 (excle公式)
sheet.write(7, 1, "=sum(B5:B7)") # 求 B5 ————B7 的总和
sheet.write(7, 2, "=sum(C5:C7)")
for i,items in enumerate(data): # i表示第几次 emuerate 可以有i
sheet.write_row(i+4,0,items)
"""
柱状图图表代码如下:
"""
chart = wb.add_chart({"type":"column"}) # column 柱状图
chart.set_title({"name":"第二季度销售统计"}) # 设置图标名称
# 2.添加数据
chart.add_series({
"name":"预期销售额", # 图例名称
# x轴取值范围
# "categories":"=第二季度!$A$5:$A$7", # 第一种方式
"categories":["第二季度",4,0,6,0], # 第二种方式
# Y轴数据的取值范围,
"values":["第二季度",4,1,6,1] #第二种方式,工作表名,开始坐标, 结束坐标
})
chart.add_series({
"name":"实际销售额", # 图例名称
# x轴取值范围
#
"categories":["第二季度",4,0,6,0], # 表示 四月 五月 六月 三个值
# Y轴数据的取值范围,
"values":["第二季度",4,2,6,2], # 表示三个值,分别放到x 轴 3个点上
"data_labels":{"value":True} # 柱状图上显示具体的数量
})
# x轴,y皱描述信息
chart.set_x_axis({"name":"月份"})
chart.set_y_axis({"name":"销售额"})
# 3.插入图表
sheet.insert_chart("A12",chart)
# 关闭文件
wb.close()
最后附上测试报告模板,该模板是根据jira 工具设计
# -*- coding:utf-8 -*-
title_style = {
"fg_color": "#808080", # 单元格的背景颜色,灰色
"bold": 1, # 字体加粗
"align": "center", # 水平对齐方式
"valign": "vcenter", # 垂直对齐方式
"font_color": "white", # 字体颜色
"font_size": 18, # 字体大小
"text_wrap": 1, # 自动换行
"top": 1, "bottom": 1, "left": 1, "right": 1 # 设置边框
}
subtitle_style = {
"fg_color": "#808080", # 单元格的背景颜色
"bold": 1, # 字体加粗
"align": "center", # 水平对齐方式
"valign": "vcenter", # 垂直对齐方式
"font_color": "white", # 字体颜色
"font_size": 12, # 字体大小
"text_wrap": 1, # 自动换行
"top": 1, "bottom": 1, "left": 1, "right": 1 # 设置边框
}
subfunc_style = {
"fg_color": "white", # 单元格的背景颜色
"bold": 1, # 字体加粗
"align": "left", # 水平对齐方式
"valign": "vcenter", # 垂直对齐方式
"font_color": "black", # 字体颜色
"font_size": 11, # 字体大小
"text_wrap": 1, # 自动换行
"top": 1, "bottom": 1, "left": 1, "right": 1 # 设置边框
}
pro_moudle_style = {
"fg_color": "white", # 单元格的背景颜色
"bold": 0, # 字体加粗
"align": "left", # 水平对齐方式
"valign": "vcenter", # 垂直对齐方式
"font_color": "#FFC000", # 字体颜色
"font_size": 11, # 字体大小
"italic": 1, # 字体倾斜
"text_wrap": 1, # 自动换行
"top": 1, "bottom": 1, "left": 1, "right": 1 # 设置边框
}
deploy_style = {
"fg_color": "#C65911", # 单元格的背景颜色
"bold": 1, # 字体加粗
"align": "center", # 水平对齐方式
"valign": "vcenter", # 垂直对齐方式
"font_color": "white", # 字体颜色
"font_size": 12, # 字体大小
"italic": 0, # 字体倾斜
"text_wrap": 1, # 自动换行
"top": 1, "bottom": 1, "left": 1, "right": 1 # 设置边框
}
wordtemp_style = {
"fg_color": "white", # 单元格的背景颜色
"bold": 0, # 字体加粗
"align": "left", # 水平对齐方式
"valign": "top", # 垂直对齐方式
"font_color": "#FFC000", # 字体颜色
"font_size": 11, # 字体大小
"italic": 1, # 字体倾斜
"text_wrap": 1, # 自动换行
"top": 1, "bottom": 1, "left": 1, "right": 1 # 设置边框
}
word_style = {
"fg_color": "white", # 单元格的背景颜色
"bold": 0, # 字体加粗
"align": "left", # 水平对齐方式
"valign": "vcenter", # 垂直对齐方式
"font_color": "black", # 字体颜色
"font_size": 11, # 字体大小
"italic": 0, # 字体倾斜
"text_wrap": 1, # 自动换行
"top": 1, "bottom": 1, "left": 1, "right": 1 # 设置边框
}
bug_num_style = {
"fg_color": "#F8CBAD", # 单元格的背景颜色
"bold": 1, # 字体加粗
"align": "left", # 水平对齐方式
"valign": "vcenter", # 垂直对齐方式
"font_color": "black", # 字体颜色
"font_size": 11, # 字体大小
"italic": 0, # 字体倾斜
"text_wrap": 1,
"top": 1, "bottom": 1, "left": 1, "right": 1 # 设置边框
}
bug_item_style = {
"fg_color": "#808080", # 单元格的背景颜色
"bold": 1, # 字体加粗
"align": "left", # 水平对齐方式
"valign": "vcenter", # 垂直对齐方式
"font_color": "red", # 字体颜色
"font_size": 12, # 字体大小
"italic": 0, # 字体倾斜
"text_wrap": 1,
"top": 1, "bottom": 1, "left": 1, "right": 1 # 设置边框
}
# 行高
Word_Height = 20
Chart_Height = 80
Ver_Chart_Height = 160
# 列宽
Title_Width = 18
Module_Width = 22
class TemplExcel(object):
"""
docstring for Template
"""
def __init__(self, workbook):
self.wb = workbook
self.row_num = 1
def set_row_num(self, num):
self.row_num += num
def get_cel(self, col_name):
return col_name + str(self.row_num)
# sheet1
# def write_version_temp(self, version, build_num):
# # 写版本测试报告模板
# ver_report = self.wb.add_worksheet(u'版本测试报告')
#
# # 设置列宽度
# ver_report.set_column("A:F", Title_Width)
# ver_report.set_column("B:B", Module_Width)
# ver_report.set_column("D:D", Module_Width)
# ver_report.set_column("F:F", Module_Width)
#
# # 写头 、 设置行高
# ver_report.merge_range('A1:F1', version + u'测试报告', self.wb.add_format(title_style))
# ver_report.set_row(0, 34)
#
# # 写项目名称列
# ver_report.merge_range('A2:A3', u'项目名称', self.wb.add_format(subfunc_style))
# ver_report.merge_range('B2:B3', version, self.wb.add_format(word_style))
# ver_report.write('C2', U'计划开发周期', self.wb.add_format(subfunc_style))
# ver_report.write('D2', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
# ver_report.write('C3', U'实际开发周期', self.wb.add_format(subfunc_style))
# ver_report.write('D3', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
# ver_report.write('E2', U'计划测试周期', self.wb.add_format(subfunc_style))
# ver_report.write('F2', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
# ver_report.write('E3', U'实际测试周期', self.wb.add_format(subfunc_style))
# ver_report.write('F3', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
# ver_report.set_row(1, Word_Height)
# ver_report.set_row(2, Word_Height)
# # 写测试版本列
# ver_report.write('A4', U'测试版本', self.wb.add_format(subfunc_style))
# ver_report.merge_range('B4:F4', u'代码版本,可SVN版本号,或贴上代码路径加版本号', self.wb.add_format(wordtemp_style))
# ver_report.set_row(3, Word_Height)
# # 写build列
# ver_report.write('A5', U'测试build数', self.wb.add_format(subfunc_style))
# ver_report.write('B5', build_num, self.wb.add_format(word_style))
# ver_report.write('C5', U'提测打回次数', self.wb.add_format(subfunc_style))
# ver_report.write('E5', U'需求变更数', self.wb.add_format(subfunc_style))
# ver_report.write('F5', '', self.wb.add_format(word_style))
# ver_report.set_row(4, Word_Height)
#
# # 测试环境
# ver_report.write('A6', U'测试环境', self.wb.add_format(subfunc_style))
# info = "平台:10.1.30.108:20719\r\n数据库:\r\n执行机:WIN10 64位\r\n浏览器:谷歌XXX"
# ver_report.merge_range('B6:F6', info, self.wb.add_format(wordtemp_style))
# ver_report.set_row(5, Chart_Height)
# # 项目相关人员
# ver_report.write('A7', U'项目相关人员', self.wb.add_format(subfunc_style))
# info = "产品:陈胤兵\r\nUI:朱玲\r\n后端:李君其(负责人)、张双贵\r\n前端:肖涛、陈磊\r\nAPP:罗长章\r\n大数据:杨青\r\n测试:徐盈盈(负责人)、卢育腊、田茂金"
# ver_report.merge_range('B7:F7', info, self.wb.add_format(wordtemp_style))
# ver_report.set_row(6, Chart_Height)
# # 测试记录归档
# ver_report.write('A8', U'测试记录归档', self.wb.add_format(subfunc_style))
# ver_report.merge_range('B8:F8', u'svn://10.1.30.109/dep/2019年/02-ZVM运维平台/04-V1.3', self.wb.add_format(wordtemp_style))
# ver_report.set_row(7, Word_Height)
# # 测试方案
# ver_report.merge_range('A9:F9', u'测试方案', self.wb.add_format(subtitle_style))
# ver_report.set_row(8, Word_Height)
# info = "重点验证:\r\n 1、故障运维的流程修改验证 --田茂金\r\n 2、xxx \r\n基本功能验证:\r\n 1、xxx --xxx"
# ver_report.merge_range('A10:F10', info, self.wb.add_format(wordtemp_style))
# ver_report.set_row(9, Chart_Height)
# # 测试结果
# ver_report.merge_range('A11:F11', u'测试结果', self.wb.add_format(subtitle_style))
# ver_report.set_row(10, Word_Height)
# info = "1、故障运维的流程修改验证通过\r\n2、xxx 的基本功能可用,但存在xxx的问题,BUG号:xxx\r\n3、xxx\r\n测试结论:xxx"
# ver_report.merge_range('A12:F12', info, self.wb.add_format(wordtemp_style))
# ver_report.set_row(11, Chart_Height)
# # 遗留问题及解决方案
# ver_report.merge_range('A13:F13', u'风险及规避措施', self.wb.add_format(subtitle_style))
# ver_report.set_row(12, Word_Height)
# info = "1、xxx\r\n 原因:xxx\r\n 解决方案:xxxx\r\n 当前规避方案:xxx"
# ver_report.merge_range('A14:F14', info, self.wb.add_format(wordtemp_style))
# ver_report.set_row(13, Chart_Height)
# sheet2
def write_bug_temp(self, build_bug={'V1.6': 1, 'V1.6.1': 2}, version_bug={'version_bug': 47}, version='test'):
"""
:param build_bug: 为{} 表示统计的单版本, {'V1.6': 1, 'V1.6.1': 2} 表示统计的多版本
:param version_bug: 单版本时会用到这个参数
:param version:
:return:
"""
# 写版本BUG分析模板----表示只有一个版本时
if not build_bug:
build_bug = version_bug # bug总数,就是取的 version-bug 参数
self.row_num = 1
bug_anal = self.wb.add_worksheet(u'版本BUG分析')
# 设置列宽度
bug_anal.set_column("A:E", Title_Width)
bug_anal.set_column("F:F", 28)
# 写头、 设置行高
bug_anal.merge_range('A1:F1', version + u'-BUG统计分析', self.wb.add_format(title_style))
bug_anal.set_row(0, 34)
self.set_row_num(1)
# 写bug总数列
for build in build_bug:
num = build_bug[build]
bug_anal.write(self.get_cel('C'), build, self.wb.add_format(subfunc_style))
bug_anal.merge_range('%s:%s' % (self.get_cel('D'), self.get_cel('F')), num, self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Word_Height)
self.set_row_num(1)
if self.row_num > 3:
bug_anal.merge_range('A2:A%s' % (self.row_num-1), u'bug总数', self.wb.add_format(subfunc_style))
bug_anal.merge_range('B2:B%s' % (self.row_num-1), list(version_bug.values())[0], self.wb.add_format(word_style))
else:
bug_anal.write('A2', u'bug总数', self.wb.add_format(subfunc_style))
bug_anal.write('B2', list(version_bug.values())[0], self.wb.add_format(word_style))
# 统计维度
bug_anal.write(self.get_cel('A'), U'统计维度', self.wb.add_format(subtitle_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), u'分布', self.wb.add_format(subtitle_style))
bug_anal.write(self.get_cel('F'), U'分析说明', self.wb.add_format(subtitle_style))
bug_anal.set_row(self.row_num - 1, Word_Height)
start_pos = self.row_num
self.set_row_num(1)
# BUG创建时间分布
bug_anal.write(self.get_cel('A'), U'BUG创建时间分布', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
self.set_row_num(1)
# 轮次间BUG分布
bug_anal.write(self.get_cel('A'), U'BUG轮次间分布', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
self.set_row_num(1)
# 模块分布
bug_anal.write(self.get_cel('A'), U'BUG模块间分布', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
self.set_row_num(1)
# 严重程度分布
bug_anal.write(self.get_cel('A'), U'BUG严重程度分布', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
self.set_row_num(1)
# BUG类型
bug_anal.write(self.get_cel('A'), U'BUG类型分布', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
self.set_row_num(1)
# 人员分布
bug_anal.write(self.get_cel('A'), U'开发人员有效BUG数', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
self.set_row_num(1)
# 人员密度
bug_anal.write(self.get_cel('A'), U'开发人员DI值', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
self.set_row_num(1)
# 测试人员有效bug数
bug_anal.write(self.get_cel('A'), U'测试人员有效bug数', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
self.set_row_num(1)
# reopen分布
bug_anal.write(self.get_cel('A'), U'开发人员reopen的BUG数', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Ver_Chart_Height)
self.set_row_num(1)
return start_pos
# sheet3
def write_bug_log(self, data):
# 写BUG记录表
bug_log = self.wb.add_worksheet(u'BUG记录')
# 设置列宽度
bug_log.set_column("A:P", 11)
bug_log.set_column("B:C", 20)
bug_log.set_column("E:E", 20)
bug_log.set_column("F:F", 40)
bug_log.set_column("J:J", 40)
# 写头
strat_row = 2
bug_log.write('A1', u'Bug编号', self.wb.add_format(bug_item_style))
bug_log.write('B1', u'所属项目', self.wb.add_format(bug_item_style))
bug_log.write('C1', u'影响版本', self.wb.add_format(bug_item_style))
bug_log.write('D1', u'报告人', self.wb.add_format(bug_item_style))
bug_log.write('E1', u'所属模块', self.wb.add_format(bug_item_style))
bug_log.write('F1', u'Bug标题', self.wb.add_format(bug_item_style))
bug_log.write('G1', u'严重程度', self.wb.add_format(bug_item_style))
bug_log.write('H1', u'优先级', self.wb.add_format(bug_item_style))
bug_log.write('I1', u'Bug类型', self.wb.add_format(bug_item_style))
bug_log.write('J1', u'BUG描述', self.wb.add_format(bug_item_style))
bug_log.write('K1', u'Bug状态', self.wb.add_format(bug_item_style))
bug_log.write('L1', u'激活次数', self.wb.add_format(bug_item_style))
bug_log.write('M1', u'经办人', self.wb.add_format(bug_item_style))
bug_log.write('N1', u'解决版本', self.wb.add_format(bug_item_style))
bug_log.write('O1', u'测试轮次', self.wb.add_format(bug_item_style))
bug_log.write('P1', u'处理结果', self.wb.add_format(bug_item_style))
bug_log.write('Q1', u'创建时间', self.wb.add_format(bug_item_style))
bug_log.set_row(0, Word_Height)
for j in range(len(data)):
row = strat_row - 1 + j
bug_log.set_row(row, Word_Height)
bug_log.write('A' + str(row+1), data[j]["bug_id"], self.wb.add_format(word_style))
bug_log.write('B' + str(row+1), data[j]["project"], self.wb.add_format(word_style))
versions = ""
for ver in data[j]["versions"]:
versions += ver + ", "
bug_log.write('C' + str(row+1), versions[:-2], self.wb.add_format(word_style))
bug_log.write('D' + str(row+1), data[j]["reporter"], self.wb.add_format(word_style))
modules = ""
for module in data[j]["modules"]:
modules += module + ", "
bug_log.write('E' + str(row+1), modules[:-2], self.wb.add_format(word_style))
bug_log.write('F' + str(row+1), data[j]["bug_title"], self.wb.add_format(word_style))
bug_log.write('G' + str(row+1), data[j]["bug_level"], self.wb.add_format(word_style))
bug_log.write('H' + str(row+1), data[j]["priority"], self.wb.add_format(word_style))
bug_log.write('I' + str(row+1), data[j]["bug_type"], self.wb.add_format(word_style))
bug_log.write('J' + str(row+1), data[j]["description"], self.wb.add_format(word_style))
bug_log.write('K' + str(row+1), data[j]["status"], self.wb.add_format(word_style))
bug_log.write('L' + str(row+1), data[j]["reopen"], self.wb.add_format(word_style))
bug_log.write('M' + str(row+1), data[j]["assignee"], self.wb.add_format(word_style))
fix_versions = ""
for ver in data[j]["fix_versions"]:
fix_versions += ver + ", "
bug_log.write('N' + str(row+1), fix_versions[:-2], self.wb.add_format(word_style))
bug_log.write('O' + str(row+1), data[j]["build"], self.wb.add_format(word_style))
bug_log.write('P' + str(row+1), data[j]["reslut"], self.wb.add_format(word_style))
bug_log.write('Q' + str(row+1), data[j]["created"], self.wb.add_format(word_style))
# sheet4
def write_req_log(self):
# 写需求变更模板
req_log = self.wb.add_worksheet(u'需求变更记录')
# 设置列宽度
req_log.set_column("A:F", Word_Height)
req_log.write('A1', u'模块', self.wb.add_format(bug_item_style))
req_log.write('B1', u'编号', self.wb.add_format(bug_item_style))
req_log.write('C1', u'原需求描述', self.wb.add_format(bug_item_style))
req_log.write('D1', u'变更描述', self.wb.add_format(bug_item_style))
req_log.write('E1', u'影响说明', self.wb.add_format(bug_item_style))
req_log.write('F1', u'变更时间', self.wb.add_format(bug_item_style))
req_log.write('G1', u'变更人', self.wb.add_format(bug_item_style))
req_log.set_row(0, Word_Height)
# sheet5
def write_project_temp(self, pro_name=u'ZVM数据运维平台V1.7', ver_num=3):
# 写项目测试报告模板
pro_report = self.wb.add_worksheet(u'项目测试报告')
# 设置列宽度
pro_report.set_column("A:F", Title_Width)
pro_report.set_column("B:B", Module_Width)
pro_report.set_column("D:D", Module_Width)
pro_report.set_column("F:F", Module_Width)
# 写头
pro_report.merge_range('A1:F1', pro_name + u'测试报告', self.wb.add_format(title_style))
# 设置行高
pro_report.set_row(0, 34)
# 写项目名称列
pro_report.merge_range('A2:A3', u'项目名称', self.wb.add_format(subfunc_style))
pro_report.merge_range('B2:B3', pro_name, self.wb.add_format(word_style))
pro_report.write('C2', U'计划开发周期', self.wb.add_format(subfunc_style))
pro_report.write('D2', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
pro_report.write('C3', U'实际开发周期', self.wb.add_format(subfunc_style))
pro_report.write('D3', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
pro_report.write('E2', U'计划开发周期', self.wb.add_format(subfunc_style))
pro_report.write('F2', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
pro_report.write('E3', U'实际开发周期', self.wb.add_format(subfunc_style))
pro_report.write('F3', '2020/10/11-2020/10/13', self.wb.add_format(wordtemp_style))
pro_report.set_row(1, Word_Height)
pro_report.set_row(2, Word_Height)
# 产品经理
pro_report.write('A4', U'产品经理', self.wb.add_format(subfunc_style))
pro_report.merge_range('B4:F4', u'xxx', self.wb.add_format(wordtemp_style))
pro_report.set_row(3, Word_Height)
# UI设计师
pro_report.write('A5', U'UI设计师', self.wb.add_format(subfunc_style))
pro_report.merge_range('B5:F5', u'xxx', self.wb.add_format(wordtemp_style))
pro_report.set_row(4, Word_Height)
# 开发人员
pro_report.write('A6', U'开发人员', self.wb.add_format(subfunc_style))
pro_report.merge_range('B6:F6', u'李君其(负责人)、xxx', self.wb.add_format(wordtemp_style))
pro_report.set_row(5, Word_Height)
# 测试人员
pro_report.write('A7', U'测试人员', self.wb.add_format(subfunc_style))
pro_report.merge_range('B7:F7', u'徐盈盈(负责人)、xxx', self.wb.add_format(wordtemp_style))
pro_report.set_row(6, Word_Height)
# 测试版本数
pro_report.write('A8', U'测试版本数', self.wb.add_format(subfunc_style))
pro_report.write('B8', ver_num, self.wb.add_format(word_style))
pro_report.write('C8', U'提测打回次数', self.wb.add_format(subfunc_style))
pro_report.write('E8', U'需求变更数', self.wb.add_format(subfunc_style))
pro_report.write('F8', '', self.wb.add_format(word_style))
pro_report.set_row(7, Word_Height)
# 测试记录归档
pro_report.write('A9', U'测试记录归档', self.wb.add_format(subfunc_style))
pro_report.merge_range('B9:F9', u'svn://10.1.30.109/dep/2019年/02-ZVM运维平台/04-V1.3', self.wb.add_format(wordtemp_style))
pro_report.set_row(8, Word_Height)
# 测试结果
pro_report.merge_range('A10:F10', u'模块功能及测试结果', self.wb.add_format(subtitle_style))
pro_report.set_row(9, Word_Height)
# 新增&修改模块
pro_report.merge_range('A11:A14', u'新增&修改模块', self.wb.add_format(subfunc_style))
pro_report.merge_range('B11:B12', u'故障运维', self.wb.add_format(pro_moudle_style))
pro_report.merge_range('C11:E11', u'工单列表增加按权限划分的顶部事项统计', self.wb.add_format(wordtemp_style))
pro_report.merge_range('C12:E12', u'xxx', self.wb.add_format(wordtemp_style))
pro_report.write('F11', U'通过', self.wb.add_format(subfunc_style))
pro_report.write('F12', U'通过', self.wb.add_format(subfunc_style))
pro_report.merge_range('B13:B14', u'xxx', self.wb.add_format(pro_moudle_style))
pro_report.merge_range('C13:E13', u'xxx', self.wb.add_format(wordtemp_style))
pro_report.merge_range('C14:E14', u'xxx', self.wb.add_format(wordtemp_style))
pro_report.write('F13', U'通过', self.wb.add_format(subfunc_style))
pro_report.write('F14', U'通过', self.wb.add_format(subfunc_style))
# 回归模块
pro_report.merge_range('A15:A16', u'回归模块', self.wb.add_format(subfunc_style))
pro_report.write('B15', U'资产管理', self.wb.add_format(pro_moudle_style))
pro_report.write('B16', U'xxx', self.wb.add_format(pro_moudle_style))
pro_report.merge_range('C15:E15', u'基本功能流程验证', self.wb.add_format(wordtemp_style))
pro_report.merge_range('C16:E16', u'xxx', self.wb.add_format(wordtemp_style))
pro_report.write('F15', U'通过', self.wb.add_format(subfunc_style))
pro_report.write('F16', U'通过', self.wb.add_format(subfunc_style))
# 遗留问题及解决方案
pro_report.merge_range('A17:F17', u'遗留问题及解决方案', self.wb.add_format(subtitle_style))
for row in range(10, 16, 1):
pro_report.set_row(row, Word_Height)
info = u"1、xxx\r\n 原因:xxx\r\n 解决方案:xxxx\r\n"
pro_report.merge_range('A18:F18', info, self.wb.add_format(wordtemp_style))
pro_report.set_row(17, Chart_Height)
# 风险及规避措施
pro_report.merge_range('A19:F19', u'风险及规避措施', self.wb.add_format(subtitle_style))
pro_report.set_row(Title_Width, Word_Height)
info = u"1、xxx\r\n当前规避方案:xxx"
pro_report.merge_range('A20:F20', info, self.wb.add_format(wordtemp_style))
pro_report.set_row(19, Chart_Height)
# 测试总结及建议
pro_report.merge_range('A21:F21', u'测试总结及建议', self.wb.add_format(subtitle_style))
pro_report.set_row(20, Word_Height)
info = u"1、xxx\r\n2、xxx"
pro_report.merge_range('A22:F22', info, self.wb.add_format(wordtemp_style))
pro_report.set_row(21, Chart_Height)
# 测试总结及建议
pro_report.merge_range('A23:F23', u'部署注意事项', self.wb.add_format(deploy_style))
pro_report.set_row(Module_Width, Word_Height)
info = u"1、xxx\r\n2、xxx"
pro_report.merge_range('A24:F24', info, self.wb.add_format(wordtemp_style))
pro_report.set_row(23, Chart_Height)
# sheet6
def write_pro_bug_temp(self, pro_name=u'ZVM数据运维平台V1.7', pro_bug=42):
# 写项目BUG分析模板
self.row_num = 1
pro_anal = self.wb.add_worksheet(u'项目BUG分析')
# 设置列宽度
pro_anal.set_column("A:E", Title_Width)
pro_anal.set_column("F:F", 28)
# 写头
pro_anal.merge_range('A1:F1', pro_name + u'-项目BUG分析', self.wb.add_format(title_style))
# 设置行高
pro_anal.set_row(0, 34)
# 写bug总数列
pro_anal.write('A2', u'bug总数', self.wb.add_format(subfunc_style))
pro_anal.merge_range('B2:F2', pro_bug, self.wb.add_format(word_style))
pro_anal.set_row(1, Word_Height)
# 统计维度
pro_anal.write('A3', U'统计维度', self.wb.add_format(subtitle_style))
pro_anal.merge_range('B3:E3', u'分布', self.wb.add_format(subtitle_style))
pro_anal.write('F3', U'分析说明', self.wb.add_format(subtitle_style))
pro_anal.set_row(2, Word_Height)
# 版本BUG时间分布
pro_anal.write('A4', U'BUG创建时间分布', self.wb.add_format(bug_num_style))
pro_anal.merge_range('B4:E4', '', self.wb.add_format(word_style))
pro_anal.write('F4', '', self.wb.add_format(word_style))
pro_anal.set_row(3, Ver_Chart_Height)
# 各版本BUG分布
pro_anal.write('A5', U'BUG版本间分布', self.wb.add_format(bug_num_style))
pro_anal.merge_range('B4:E4', '', self.wb.add_format(word_style))
pro_anal.write('F5', '', self.wb.add_format(word_style))
pro_anal.set_row(4, Ver_Chart_Height)
# 模块分布
pro_anal.write('A6', U'BUG模块间分布', self.wb.add_format(bug_num_style))
pro_anal.merge_range('B5:E5', '', self.wb.add_format(word_style))
pro_anal.write('F6', '', self.wb.add_format(word_style))
pro_anal.set_row(5, Ver_Chart_Height)
# 严重程度分布
pro_anal.write('A7', U'BUG严重程度分布', self.wb.add_format(bug_num_style))
pro_anal.merge_range('B6:E6', '', self.wb.add_format(word_style))
pro_anal.write('F7', '', self.wb.add_format(word_style))
pro_anal.set_row(6, Ver_Chart_Height)
# BUG类型
pro_anal.write('A8', U'BUG类型分布', self.wb.add_format(bug_num_style))
pro_anal.merge_range('B7:E7', '', self.wb.add_format(word_style))
pro_anal.write('F8', '', self.wb.add_format(word_style))
pro_anal.set_row(7, Ver_Chart_Height)
# 人员分布
pro_anal.write('A9', U'开发人员有效BUG数', self.wb.add_format(bug_num_style))
pro_anal.merge_range('B8:E8', '', self.wb.add_format(word_style))
pro_anal.write('F9', '', self.wb.add_format(word_style))
pro_anal.set_row(8, Ver_Chart_Height)
# 人员密度
pro_anal.write('A10', U'开发人员DI值', self.wb.add_format(bug_num_style))
pro_anal.merge_range('B9:E9', '', self.wb.add_format(word_style))
pro_anal.write('F10', '', self.wb.add_format(word_style))
pro_anal.set_row(9, Ver_Chart_Height)
# 测试人员有效bug数
pro_anal.write('A11', U'测试人员有效bug数', self.wb.add_format(bug_num_style))
pro_anal.merge_range('B10:E10', '', self.wb.add_format(word_style))
pro_anal.write('F11', '', self.wb.add_format(word_style))
pro_anal.set_row(10, Ver_Chart_Height)
# reopen分布
pro_anal.write('A12', U'开发人员reopen的BUG数', self.wb.add_format(bug_num_style))
pro_anal.merge_range('B11:E11', '', self.wb.add_format(word_style))
pro_anal.write('F12', '', self.wb.add_format(word_style))
pro_anal.set_row(11, Ver_Chart_Height)
# 项目BUG统计位置默认从第4行开始
self.row_num = 3
return self.row_num
# sheet7
def write_ver_bug_temp(self, pro_name=u'ZVM数据运维平台V1.7', pro_bug=42, version_bug={"ZVM运维平台V1.6": {"version_bug": 46}}):
# 写项目下版本间BUG分析测试报告模板
version_num = len(list(version_bug.keys()))
chart_height = 160
if version_num > 3:
chart_height = Ver_Chart_Height + (version_num-3) * Word_Height
self.row_num = 1
bug_anal = self.wb.add_worksheet(u'版本间BUG分析')
# 设置列宽度
bug_anal.set_column("A:E", Title_Width)
bug_anal.set_column("F:F", 28)
# 写头
bug_anal.merge_range('A1:F1', pro_name + u'-版本间统计分析', self.wb.add_format(title_style))
self.set_row_num(1)
# 设置行高
bug_anal.set_row(0, 34)
# 写bug总数列
for ver in version_bug:
num = version_bug[ver]["version_bug"]
bug_anal.write(self.get_cel('C'), ver, self.wb.add_format(subfunc_style))
bug_anal.merge_range('%s:%s' % (self.get_cel('D'), self.get_cel('F')), num, self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, Word_Height)
self.set_row_num(1)
if self.row_num > 3:
bug_anal.merge_range('A2:A%s' % (self.row_num-1), u'bug总数', self.wb.add_format(subfunc_style))
bug_anal.merge_range('B2:B%s' % (self.row_num-1), pro_bug, self.wb.add_format(word_style))
else:
bug_anal.write('A2', u'bug总数', self.wb.add_format(subfunc_style))
bug_anal.write('B2', pro_bug, self.wb.add_format(word_style))
# 统计维度
bug_anal.write(self.get_cel('A'), U'统计维度', self.wb.add_format(subtitle_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), u'分布', self.wb.add_format(subtitle_style))
bug_anal.write(self.get_cel('F'), U'分析说明', self.wb.add_format(subtitle_style))
bug_anal.set_row(self.row_num - 1, Word_Height)
start_pos = self.row_num
self.set_row_num(1)
# 模块分布
bug_anal.write(self.get_cel('A'), U'BUG模块间分布', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, chart_height)
self.set_row_num(1)
# 严重程度分布
bug_anal.write(self.get_cel('A'), U'BUG严重程度分布', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, chart_height)
self.set_row_num(1)
# BUG类型
bug_anal.write(self.get_cel('A'), U'BUG类型分布', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, chart_height)
self.set_row_num(1)
# 人员分布
bug_anal.write(self.get_cel('A'), U'开发人员有效BUG数', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, chart_height)
self.set_row_num(1)
# 人员密度
bug_anal.write(self.get_cel('A'), U'开发人员DI值', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, chart_height)
self.set_row_num(1)
# 测试人员有效bug数
bug_anal.write(self.get_cel('A'), U'测试人员有效bug数', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, chart_height)
self.set_row_num(1)
# reopen分布
bug_anal.write(self.get_cel('A'), U'开发人员reopen的BUG数', self.wb.add_format(bug_num_style))
bug_anal.merge_range('B%s:E%s' % (self.row_num, self.row_num), '', self.wb.add_format(word_style))
bug_anal.write(self.get_cel('F'), '', self.wb.add_format(word_style))
bug_anal.set_row(self.row_num - 1, chart_height)
self.set_row_num(1)
return start_pos
if __name__ == '__main__':
import xlsxwriter
dd = xlsxwriter.Workbook('test0831.xlsx')
opr = TemplExcel(dd)
"""版本报告 sheet1-----sheet4"""
# sheet1
opr.write_version_temp("v1.7",25)
# sheet2 两种情况
# opr.write_bug_temp()
opr.write_bug_temp(build_bug={})
# sheet3
data = [{
"bug_id": "id001", "project": "项目", "versions": ['1.1', '1.2', '1.3'], "reporter": "陶科",
"modules": ['登录', "首页"],
"bug_title": "标题", "bug_level": "严重", "priority": "优先级", "bug_type": "代码错误", "description": "小bug",
"status": "未解决", "reopen": "5", "assignee": "经办人", "fix_versions": ['1.1', '1.2', '1.3'],
"build": "3", "reslut": "处理了", "created": "1月1日"
},
{"bug_id": "id002", "project": "项目2", "versions": ['1.1'], "reporter": "小李", "modules": ['项目中心'],
"bug_title": "标题", "bug_level": "严重", "priority": "优先级", "bug_type": "代码错误", "description": "小bug",
"status": "未解决", "reopen": "5", "assignee": "经办人", "fix_versions": ['1.1', '1.2', '1.3'],
"build": "3", "reslut": "处理了", "created": "1月1日"
}]
opr.write_bug_log(data)
# sheet4
opr.write_req_log()
"""版本报告 sheet5-----sheet4"""
opr.write_project_temp()
opr.write_pro_bug_temp()
opr.write_ver_bug_temp()
dd.close()