生成pdf/excel文档

from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, PageBreak, Table, TableStyle
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
from reportlab.lib.units import mm
from reportlab.lib import colors
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from autoTestMySql import mySqlOperator
import os
import xlwt

__author = "王庆武"
__date = "2020-04"

pdfmetrics.registerFont(TTFont('pingbold', 'simsun.ttf'))
pdfmetrics.registerFont(TTFont('ping', 'simsun.ttf'))
pdfmetrics.registerFont(TTFont('hv', 'simsun.ttf'))

class testData(mySqlOperator):
def __init__(self, testCasesContent, testCasesSelection):
mySqlOperator.__init__(self)
self.testCasesContent = testCasesContent
self.testCasesSelection = testCasesSelection
self.basic_data = self.getBasicData()
# 根据测试用例获取测试报告表格中合并单元格项
def getRowNumberMerge(self):
rowNumber = []
for _ in self.basic_data:
if _[0]:
rowNumber.append(self.basic_data.index(_) + 1)
return rowNumber
# 获取测试用例的测试步骤
def getTestSteps(self, singleTestCasesSelection):
for _ in self.testCasesContent:
if singleTestCasesSelection in _:
index = self.testCasesContent.index(_)
testSteps = ['_'.join(testStepDetail[3].split('_')[1:])
for testStepDetail in self.testCasesContent[index][4]]
return testSteps
# TODO 获取预期,实际结果,判定后需更新
def getBasicData(self):
basicData = [['序号', '操作步骤', '预期结果', '实际结果', '判定']]
for index in range(len(self.testCasesSelection) - 1):
if len(self.testCasesSelection[index]) < len(self.testCasesSelection[index + 1]):
basicData.append([self.testCasesSelection[index],
self.getTestDescription(self.testCasesSelection[index])])
else:
basicData.append([self.testCasesSelection[index],
self.getTestDescription(self.testCasesSelection[index])])
testSteps = self.getTestSteps(self.testCasesSelection[index])
for steps in testSteps:
basicData.append(['', steps])
basicData.append([self.testCasesSelection[-1],
self.getTestDescription(self.testCasesSelection[-1])])
for steps in self.getTestSteps(self.testCasesSelection[-1]):
basicData.append(['', steps])
return basicData
# 获取描述
def getTestDescription(self, singleTestCasesSelection):
descriptionIndexList = singleTestCasesSelection.split('.')
if len(descriptionIndexList) == 1:
return self.getSelectNavigationCatelog(descriptionIndexList[-1])
elif len(descriptionIndexList) == 2:
return self.getSelectConcreteModul(descriptionIndexList[-1])
else:
return self.getSelectTestItems(descriptionIndexList[-1])

# 生成PDF文件
class reportGenerator(testData):
def __init__(self, filename, testCasesContent, testCasesSelection):
testData.__init__(self, testCasesContent, testCasesSelection)
self.filename = filename
seperator = self.filename.split('/')
self.file_path = './report/'
for _ in seperator[:-1]:
self.file_path += _ + r'/'
if os.path.exists(self.file_path):
pass
else:
os.mkdir(self.file_path)
# --------------------------------------------------------------------------------------------------------------
# PDF相关格式
self.title_style = ParagraphStyle(name="TitleStyle", fontName="pingbold", fontSize=48, alignment=TA_LEFT,)
self.sub_title_style = ParagraphStyle(name="SubTitleStyle", fontName="hv", fontSize=32,
textColor=colors.HexColor(0x666666), alignment=TA_LEFT, )
self.content_style = ParagraphStyle(name="ContentStyle", fontName="ping", fontSize=18,
leading=25, spaceAfter=10,
underlineWidth=1, alignment=TA_LEFT, )
self.content_style1 = ParagraphStyle(name="ContentStyle", fontName="ping", fontSize=10, leading=25,
spaceAfter=2,
underlineWidth=1, alignment=TA_LEFT, textColor=colors.HexColor(0x666666))
self.foot_style = ParagraphStyle(name="FootStyle", fontName="ping", fontSize=14,
textColor=colors.HexColor(0xB4B4B4), leading=25,
spaceAfter=20, alignment=TA_CENTER, )
self.table_title_style = ParagraphStyle(name="TableTitleStyle", fontName="pingbold", fontSize=20, leading=25,
spaceAfter=10, alignment=TA_LEFT, )
self.sub_table_style = ParagraphStyle(name="SubTableTitleStyle", fontName="ping", fontSize=16, leading=25,
spaceAfter=10, alignment=TA_LEFT, )
testReportTableStyle = self.getTestReportTableStyle(self.testCasesSelection)
self.basic_style = TableStyle(testReportTableStyle)
# --------------------------------------------------------------------------------------------------------------
# Excel相关格式
# 标题格式
self.style_title = xlwt.XFStyle()
self.style_title.borders.bottom = xlwt.Borders.THIN
self.style_title.borders.top = xlwt.Borders.THIN
self.style_title.borders.left = xlwt.Borders.THIN
self.style_title.borders.right = xlwt.Borders.THIN
self.style_title.alignment.wrap = 1
self.style_title.alignment.horz = 0x01
self.style_title.alignment.vert = 0x01
pattern_title = xlwt.Pattern()
pattern_title.pattern = xlwt.Pattern.SOLID_PATTERN
pattern_title.pattern_fore_colour = 22
self.style_title.pattern = pattern_title
font_title = xlwt.Font()
font_title.bold = True
self.style_title.font = font_title
# 序号、操作步骤、预期结果、实际结果、判定
self.style_index = xlwt.XFStyle()
self.style_index.borders.bottom = xlwt.Borders.THIN
self.style_index.borders.top = xlwt.Borders.THIN
self.style_index.borders.left = xlwt.Borders.THIN
self.style_index.borders.right = xlwt.Borders.THIN
self.style_index.alignment.wrap = 1
self.style_index.alignment.horz = 0x01
self.style_index.alignment.vert = 0x01
# 合并单元格字体加粗
self.style_index1 = xlwt.XFStyle()
self.style_index1.borders.bottom = xlwt.Borders.THIN
self.style_index1.borders.top = xlwt.Borders.THIN
self.style_index1.borders.left = xlwt.Borders.THIN
self.style_index1.borders.right = xlwt.Borders.THIN
self.style_index1.alignment.wrap = 1
self.style_index1.alignment.horz = 0x01
self.style_index1.alignment.vert = 0x01
font_index = xlwt.Font()
font_index.bold = True
self.style_index1.font = font_index
# 结果pass格式
self.style_pass = xlwt.XFStyle()
self.style_pass.borders.bottom = xlwt.Borders.THIN
self.style_pass.borders.top = xlwt.Borders.THIN
self.style_pass.borders.left = xlwt.Borders.THIN
self.style_pass.borders.right = xlwt.Borders.THIN
self.style_pass.alignment.wrap = 1
self.style_pass.alignment.horz = 0x01
self.style_pass.alignment.vert = 0x01
pattern_pass = xlwt.Pattern()
pattern_pass.pattern = xlwt.Pattern.SOLID_PATTERN
pattern_pass.pattern_fore_colour = 3
self.style_pass.pattern = pattern_pass
# 结果fail格式
self.style_fail = xlwt.XFStyle()
self.style_fail.borders.bottom = xlwt.Borders.THIN
self.style_fail.borders.top = xlwt.Borders.THIN
self.style_fail.borders.left = xlwt.Borders.THIN
self.style_fail.borders.right = xlwt.Borders.THIN
self.style_fail.alignment.wrap = 1
self.style_fail.alignment.horz = 0x01
self.style_fail.alignment.vert = 0x01
pattern_fail = xlwt.Pattern()
pattern_fail.pattern = xlwt.Pattern.SOLID_PATTERN
pattern_fail.pattern_fore_colour = 2
self.style_fail.pattern = pattern_fail
# 合并单元格格式
def getTestReportTableStyle(self, testCasesSelection):
# 获取需要合并单元格的行号
rowNumber = self.getRowNumberMerge()
style1 = [('SPAN', (1, row), (3, row)) for row in rowNumber]
# style2 = [('SPAN', (4, row), (5, row)) for row in rowNumber]
allstyle = [
('FONTNAME', (0, 0), (-1, -1), 'ping'),
('FONTSIZE', (0, 0), (-1, -1), 12),
('ALIGN', (0, 0), (-1, -1), 'LEFT'),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('BOTTOMPADDING', (0, 0), (-1, -1), 6)] + style1 + [('GRID', (0, 0), (-1, -1), 0.5, colors.black)]
return allstyle
pass
# 生成PDF格式测试报告
def genTaskPDF(self, home_data):
story = []

# 首页内容
story.append(Spacer(1, 10 * mm))
img = Image('./1.jpeg')
img.drawHeight = 20 * mm
img.drawWidth = 20 * mm
img.hAlign = TA_LEFT
story.append(img)
story.append(Spacer(1, 5 * mm))
story.append(Paragraph("测试报告", self.title_style))
story.append(Spacer(1, 20 * mm))
story.append(Paragraph("Test Report of " + home_data['task_number'], self.sub_title_style))
story.append(Spacer(1, 25 * mm))
story.append(Paragraph("报告编号:" + home_data['report_code'], self.content_style))
story.append(Paragraph("项目名称:" + home_data['task_name'], self.content_style))
story.append(Paragraph("报告日期:" + home_data['report_date'], self.content_style))
story.append(Paragraph("测试人员:" + home_data['report_creator'], self.content_style))
story.append(Paragraph("校验和:" + home_data['check_sum'], self.content_style))
story.append(Spacer(1, 5 * mm))
story.append(Paragraph("项目负责人:" + home_data['manager'], self.content_style1))
story.append(Paragraph("软件工程师:" + home_data['developer'], self.content_style1))
story.append(Paragraph("电脑板类型:" + home_data['type2'], self.content_style1))
story.append(Paragraph("项目类型:" + home_data['type1'], self.content_style1))
story.append(Spacer(1, 45 * mm))
story.append(Paragraph("内部文档,请勿外传", self.foot_style))
story.append(PageBreak())

# 表格允许单元格内容自动换行格式设置
stylesheet = getSampleStyleSheet()
body_style = stylesheet["BodyText"]
body_style.wordWrap = 'CJK'
body_style.fontName = 'ping'
body_style.fontSize = 12

# 测试用例
story.append(Paragraph("测试用例", self.sub_table_style))
# basic_data = self.getBasicData()
basic_data_change =[[Paragraph(cell, body_style) for cell in row] for row in self.basic_data]
basic_table = Table(basic_data_change, colWidths=[25*mm, 40*mm, 40*mm, 40*mm, 15*mm], style=self.basic_style)
story.append(basic_table)
story.append(Spacer(1, 10 * mm))

doc = SimpleDocTemplate(self.file_path + self.filename.split('/')[-1] + ".pdf",
leftMargin=30 * mm, rightMargin=20 * mm, topMargin=20 * mm, bottomMargin=20 * mm)

doc.build(story)
pass
# 生成excel格式测试报告
def genTaskExcel(self, home_data):
result_workbook = xlwt.Workbook(encoding='UTF-8')
result_sheet = result_workbook.add_sheet(home_data['task_number'])
# 设置单元格宽度
result_sheet.col(0).width = 3000
result_sheet.col(1).width = 7000
result_sheet.col(2).width = 7000
result_sheet.col(3).width = 7000
result_sheet.col(4).width = 2500
# 添加标题
title_list = ['序号', '操作步骤', '预期结果', '实际结果', '判定']
for _ in title_list: result_sheet.write(
0, title_list.index(_), label=_, style=self.style_title)
# basic_data = self.getBasicData()
rowNumberList = self.getRowNumberMerge()
# 添加测试数据
for index in range(1, len(self.basic_data)):
if index in rowNumberList: result_sheet.write(index,
0, self.basic_data[index][0], style=self.style_index1) result_sheet.write_merge(index, index,
1, 3, self.basic_data[index][1], style=self.style_index1)
# TODO 预期、实际、判定待更新
# result_sheet.write(index, 4, basic_data[-1])
else:
for _ in self.basic_data[index]: result_sheet.write(index,
self.basic_data[index].index(_), label=_, style=self.style_index) result_workbook.save(
self.file_path + self.filename.split('/')[-1] + '.xls')
'''
basic_data = self.getBasicData()
'''
# 生成测试报告
def generateReport(self, home_data):
self.genTaskExcel(home_data)
self.genTaskPDF(home_data)

# 生成excel文件
posted @ 2022-03-04 17:29  王大老爷  阅读(27)  评论(0编辑  收藏  举报