项目需要,需要自动生成pdf测试报告。经过对比之后,选择使用了reportlab模块。 项目背景:开发一个测试平台,供测试维护测试用例,执行测试用例,并且生成测试报告(包含pdf和excel),将生成的测试报告以邮件的形式发送相关人。
excel生成代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
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 生成excel文件的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/zoe-yan/p/11356542.html