具體代碼如下:
# -*- coding: utf-8 -*-
import xlsxwriter,openpyxl,os,time
from tools.configData import configKV
from openpyxl import styles
from report.collectReportData import reportData
class reportExcel(object):
# lastrow=0
def get_format(self,wd, option={}):
return wd.add_format(option)
# 設置居中樣式
def get_format_center(self,wd, num=1):
return wd.add_format({'align': 'left', 'valign': 'vcenter', 'border': num})
def set_border_(self,wd, num=1):
return wd.add_format({}).set_border(num)
# 寫數據
def _write_center(self,worksheet, cl, data, wd):
return worksheet.write(cl, data, self.get_format_center(wd))
#總覽表,餅圖表示
def overview_init(self,worksheet,workbook,datapie): #data = {"test_name": "MMS","test_sum": 110,"test_success": 80,"test_failed": 20,"test_not":10,'defect_rate':18,'total_serious':6,'total_medium':5,'total_commonly':8}
# 設置列行的寬高
worksheet.set_column("A:A", 15) #設置一列或者多列單元屬性
worksheet.set_column("B:B", 15)
worksheet.set_column("C:C", 15)
worksheet.set_column("D:D", 15)
worksheet.set_column("E:E", 15)
worksheet.set_column("F:F", 15)
worksheet.set_column("G:G", 15)
worksheet.set_column("H:H", 15)
worksheet.set_column("I:I", 15)
# worksheet.set_row(1, 30)
# worksheet.set_row(2, 30)
# worksheet.set_row(3, 30)
define_format_H1 = self.get_format(workbook, {'bold': True, 'font_size': 18}) #在工作表中創建一個新的格式對象來格式化單元格,實現加粗,字體18號大小
define_format_H2 = self.get_format(workbook, {'bold': True, 'font_size': 14}) #在工作表中創建一個新的格式對象來格式化單元格,實現加粗,字體14號大小
define_format_H1.set_border(1) #邊框加粗1
define_format_H2.set_border(1)
define_format_H1.set_align("center")
define_format_H2.set_align("center")
define_format_H2.set_bg_color("blue") #填充背景顏色藍色
define_format_H2.set_color("#ffffff") #填充單元格內容的顏色為白色
worksheet.merge_range('A1:I1', '測試結果總概況', define_format_H1)
worksheet.merge_range('A2:I2', '測試概括', define_format_H2)
# worksheet.merge_range('A3:A6', '這里放圖片', self.get_format_center(workbook))
self._write_center(worksheet, "A3", '項目名稱', workbook)
self._write_center(worksheet, "B3", "總用例數", workbook)
self._write_center(worksheet, "C3", "通過總數", workbook)
self._write_center(worksheet, "D3", "失敗總數", workbook)
self._write_center(worksheet, "E3", "未測試總數", workbook)
self._write_center(worksheet, "F3", '缺陷率(%)', workbook)
self._write_center(worksheet, "G3", "嚴重缺陷", workbook)
self._write_center(worksheet, "H3", "中等缺陷", workbook)
self._write_center(worksheet, "I3", "一般缺陷", workbook)
self._write_center(worksheet, "A4", datapie['test_name'], workbook)
self._write_center(worksheet, "B4", datapie['test_sum'], workbook)
self._write_center(worksheet, "C4", datapie['test_success'], workbook)
self._write_center(worksheet, "D4", datapie['test_failed'], workbook)
self._write_center(worksheet, "E4", datapie['test_not'], workbook)
self._write_center(worksheet, "F4", datapie['defect_rate'], workbook)
self._write_center(worksheet, "G4", datapie['total_serious'], workbook)
self._write_center(worksheet, "H4", datapie['total_medium'], workbook)
self._write_center(worksheet, "I4", datapie['total_commonly'], workbook)
self.overall_pie(workbook, worksheet)
self.bug_grade_pie(workbook, worksheet)
#bug分布表,柱狀圖表示
def distribution_init(self,worksheet,workbook,datacolumn):#{'load-exchange-rate':{'serious':3,'medium':5,'commonly':2,'percent':30},'classify':{'serious':3,'medium':5,'commonly':2,'percent':30}.....}
define_format_H1 = self.get_format(workbook,{'bold': True, 'font_size': 18}) # 在工作表中創建一個新的格式對象來格式化單元格,實現加粗,字體18號大小
define_format_H2 = self.get_format(workbook,{'bold': True, 'font_size': 14}) # 在工作表中創建一個新的格式對象來格式化單元格,實現加粗,字體14號大小
define_format_H1.set_border(1) # 邊框加粗1
define_format_H2.set_border(1)
define_format_H1.set_align("center")
define_format_H2.set_align("center")
define_format_H2.set_bg_color("blue") # 填充背景顏色藍色
define_format_H2.set_color("#ffffff") # 填充單元格內容的顏色為白色
worksheet.merge_range('A20:F20', '各個接口缺陷分布情況', define_format_H1)
worksheet.merge_range('A21:F21', '缺陷分布', define_format_H2)
self._write_center(worksheet, "A22", '接口名稱', workbook)
self._write_center(worksheet, "B22", '嚴重缺陷', workbook)
self._write_center(worksheet, "C22", "中等缺陷", workbook)
self._write_center(worksheet, "D22", "一般缺陷", workbook)
self._write_center(worksheet, "E22", "缺陷總數", workbook)
self._write_center(worksheet, "F22", "百分比(%)", workbook)
keys_interface=datacolumn.keys()
col=22
for interfaceName in keys_interface:
col=col+1
self._write_center(worksheet, 'A'+str(col), interfaceName, workbook)
self._write_center(worksheet, 'B'+ str(col), datacolumn[interfaceName]['serious'], workbook)
self._write_center(worksheet, 'C'+ str(col), datacolumn[interfaceName]['medium'], workbook)
self._write_center(worksheet, 'D'+ str(col), datacolumn[interfaceName]['commonly'], workbook)
self._write_center(worksheet, 'E' + str(col), datacolumn[interfaceName]['total'], workbook)
self._write_center(worksheet, 'F' + str(col), datacolumn[interfaceName]['percent'], workbook)
self.bug_grade_column(workbook, worksheet,col)
# self.lastrow=col
# 生成總體情況的餅形圖
def overall_pie(self,workbook, worksheet):
chart1 = workbook.add_chart({'type': 'pie'})
chart1.add_series({
'name': '總體情況圖',
'categories': '=測試總況!$C$3:$E$3',
'values': '=測試總況!$C$4:$E$4',
})
chart1.set_title({'name': '總體情況圖'})
chart1.set_style(10)
chart1.set_size({'width': 400, 'height': 250})
worksheet.insert_chart('A6', chart1)
# 生成缺陷情況的餅形圖
def bug_grade_pie(self, workbook, worksheet):
chart1 = workbook.add_chart({'type': 'pie'})
chart1.add_series({
'name': '各嚴重程度缺陷所占比例',
'categories': '=測試總況!$G$3:$I$3',
'values': '=測試總況!$G$4:$I$4',
})
chart1.set_title({'name': '各嚴重程度缺陷所占比例'})
chart1.set_style(10)
chart1.set_size({'width': 400, 'height': 250})
worksheet.insert_chart('E6', chart1)
# 柱狀圖統計各個接口各種嚴重程度的缺陷數
def bug_grade_column(self,workbook,worksheet,lastrow):
chart1 = workbook.add_chart({"type": "column"})
chart1.add_series({
"name": "=測試總況!$B$22", # 圖例項
"categories": "=測試總況!$A$23:$A$"+str(lastrow), # X軸 Item名稱
"values": "=測試總況!$B$23:$B$"+str(lastrow) # X軸Item值
})
chart1.add_series({
"name": "=測試總況!$C$22",
"categories": "=測試總況!$A$23:$A$"+str(lastrow),
"values": "=測試總況!$C$23:$C$"+str(lastrow)
})
chart1.add_series({
"name": "=測試總況!$D$22",
"categories": "=測試總況!$A$23:$A$" + str(lastrow),
"values": "=測試總況!$D$23:$D$" + str(lastrow)
})
# 添加柱狀圖標題
chart1.set_title({"name": "各接口缺陷數分布圖"})
# Y軸名稱
chart1.set_y_axis({"name": "缺陷數"})
# X軸名稱
chart1.set_x_axis({"name": "缺陷嚴重等級"})
# 圖表樣式
chart1.set_style(11)
if(lastrow<29):
lastrow=28
chart1.set_size({'width': 80*(lastrow-23), 'height': 388})
worksheet.insert_chart('A'+str(lastrow), chart1, {'x_offset': (lastrow-22)*5, 'y_offset': 25})
#將filename1的sheetname1的內容復制到filename2的sheetname2中
def replace_xls(self,filename1,sheetname1,filename2,sheetname2):
if(os.path.exists(filename1) and os.path.exists(filename2)):
wb1 = openpyxl.load_workbook(filename1)
wb2 = openpyxl.load_workbook(filename2)
sheets1=wb1.sheetnames
sheets2=wb2.sheetnames
if(sheetname1 in sheets1 and sheetname2 in sheets2):
sheet1 = wb1.get_sheet_by_name(sheetname1)
sheet2 = wb2.get_sheet_by_name(sheetname2)
max_row = sheet1.max_row # 最大行數
value_dict=configKV().getKeys_values('case.ini','mms')
value_list=[]
value_list.append(value_dict.get('interface_name'))
value_list.append(value_dict.get('parameter'))
value_list.append(value_dict.get('result'))
value_list.append(value_dict.get('bugdescription'))
value_list.append(value_dict.get('flag'))
value_list.append(value_dict.get('priority'))
#設置報告的列標題
sheet2.cell(1, 1, 'interface_name')
sheet2.cell(1, 2, 'parameter')
sheet2.cell(1, 3, 'result')
sheet2.cell(1, 4, 'bugdescription')
sheet2.cell(1, 5, 'flag')
sheet2.cell(1, 6, 'time')
sheet2.cell(1, 7, 'priority')
sheet2.cell(1, 1).fill = styles.PatternFill(fill_type='solid', fgColor="FFFF00")
sheet2.cell(1, 2).fill = styles.PatternFill(fill_type='solid', fgColor="FFFF00")
sheet2.cell(1, 3).fill = styles.PatternFill(fill_type='solid', fgColor="FFFF00")
sheet2.cell(1, 4).fill = styles.PatternFill(fill_type='solid', fgColor="FFFF00")
sheet2.cell(1, 5).fill = styles.PatternFill(fill_type='solid', fgColor="FFFF00")
sheet2.cell(1, 6).fill = styles.PatternFill(fill_type='solid', fgColor="FFFF00")
sheet2.cell(1, 7).fill = styles.PatternFill(fill_type='solid', fgColor="FFFF00")
font_cell = styles.Font(name='等線', size=14, italic=False, color=styles.colors.RED, bold=True)
sheet2['A1'].font=font_cell
sheet2['B1'].font = font_cell
sheet2['C1'].font = font_cell
sheet2['D1'].font = font_cell
sheet2['E1'].font = font_cell
sheet2['F1'].font = font_cell
sheet2['G1'].font = font_cell
#設置行高
sheet2.row_dimensions[1].height = 20
# 設置列寬
sheet2.column_dimensions['A'].width = 20
sheet2.column_dimensions['B'].width = 50
sheet2.column_dimensions['D'].width = 120
sheet2.column_dimensions['E'].width = 5
sheet2.column_dimensions['F'].width = 20
n=1
for row in range(1, max_row + 1):
result_index=int(value_dict.get('result'))
result = sheet1.cell(row,result_index+1).value
flag = sheet1.cell(row, int(value_dict.get('flag'))+1).value
priority = sheet1.cell(row, int(value_dict.get('priority'))).value
#插入數據
if(row>1 and result==0 and flag=='Y'):
n=n+1
interface_name = sheet1.cell(row,int(value_dict.get('interface_name'))+1).value
sheet2.cell(n,1,bytes(str(interface_name),encoding='utf-8'))
parameter = sheet1.cell(row, int(value_dict.get('parameter'))+1).value
sheet2.cell(n,2, bytes(str(parameter), encoding='utf-8'))
sheet2.cell(n,3, bytes(str(result), encoding='utf-8'))
bugdescription = sheet1.cell(row, int(value_dict.get('bugdescription'))+1).value
sheet2.cell(n,4, bytes(str(bugdescription), encoding='utf-8'))
sheet2.cell(n,5, bytes(str(flag), encoding='utf-8'))
sheet2.cell(n,6, bytes(str(priority), encoding='utf-8'))
wb2.save(filename2) # 保存數據
wb1.close() # 關閉excel
wb2.close()
else:
print(sheetname1+' 或 '+sheetname2+' 不存在')
else:
print(filename1+' 或 '+filename2+' 不存在')
#filename:測試報告的excel的名稱
def writerReport(self,filename,datapie,datacolumn):
now=time.strftime("%Y%m%d %H%M%S", time.localtime())
filename2_list=filename2.split('.')
file2 = (path + filename2_list[0]+now+'.'+filename2_list[1]).replace('\\','/')
workbook = xlsxwriter.Workbook(file2)
worksheet = workbook.add_worksheet("測試總況")
self.distribution_init(worksheet, workbook,datacolumn)
self.overview_init(worksheet, workbook, datapie)
workbook.close() # workbook關閉之前不會生成excel文檔
if __name__=='__main__':
report=reportExcel()
#以下兩個dict(datapie,datacolumn)需要構建好數據
datapie = {"test_name": "MMS","test_sum": 110,"test_success": 80,"test_failed": 20,"test_not":10,'defect_rate':18,'total_serious':6,'total_medium':5,'total_commonly':8}
datacolumn={'load-exchange-rate': {'serious': 13, 'medium': 15, 'commonly': 12,'total':30,'percent':30},'classify': {'serious': 13, 'medium': 5, 'commonly': 2,'total':30,'percent':20},
'stock-suspend': {'serious': 3, 'medium': 5, 'commonly': 12,'total':30,'percent':20},'stock-brief': {'serious': 3, 'medium': 15, 'commonly': 2,'total':30,'percent':30}}
report.writerReport('DataReport.xlsx',datapie,datacolumn) #DataReport.xlsx為報告名稱,datapie,datacolumn為報告數據
最終生成的測試報告樣式如下: