Reportlab是Python的标准库,可以画图、画表格、编辑文本,最后输出PDF格式。其逻辑与编辑Word文档或PPT非常相似。有两种方法:1)创建一个空白文档,然后在上面写文字、画图片等;2)创建一个空白列表,以填充的形式插入各种文本框、图片等,最后生成一个PDF文档。因为需要为用户生成报表,需要插入图片、表格等,所以采用了第二种方法。安装第三方库Reportlab,导入Python第三方库。使用前需要先安装:pipinstallreportlabmoduleimport提前导入相关内容并注册字体。(注册字体前需要准备好字体文件)fromreportlab.pdfbaseimportpdfmetrics#注册字体fromreportlab.pdfbase.ttfontsimportTTFont#Fontclassfromreportlab.platypusimportTable,SimpleDocTemplate,Paragraph,Image#Reportlab的报表内容相关类.lib.pagesizesimportletter#Logo大小(8.5*inch,11*inch)fromreportlab.lib.stylesimportgetSampleStyleSheet#Textstylefromreportlab.libimportcolors#Colormodulefromreportlab.graphics.charts.barchartsimportVerticalBarChart#Chartclassfromreportlab.graphics.charts.legendsimportLegend#Legendclassfromreportlab.graphics.shapesimportDrawing#绘图工具fromreportlab.lib.unitsimportcm#单位:cm#注册字体(提前准备好字体文件),如果同一个文件可以注册多种字体)pdfmetrics.registerFont(TTFont('SimSun','SimSun.ttf'))封装不同内容对应的函数创建一个Graphs类,提供不同的report内容通过不同的静态方法,包括:标题、一般段落、图片、表格和图表。目前函数中的相关数据大多是固定值,可以根据情况设置为相关参数。ClassGraphs:#绘制标题@StaticMethodDEFDRAW_TITLE(Title:STR):#获取所有样式表style=GetsampleStyheet()#获取标题样式CT=style['heading1']#单独设置样式关联相关属性CT.FONTNT.FONTNT.FONTNTNTNTNNTNNTNSimsun'#fontnamect.fontsize=18#Fontsizect.leading=50#Lingledistancect.textColor=COLORS.GREEN#fontcolorct.alignment=1#andreturnReturnParagraph(Title,CT)#绘制小标题@StaticMethoddefDraw_litTLE_TITLE(Title:STR):#获取所有样式表style=GetsampleSheet()#相关属性ct.fontName='SimSun'#字体名称ct.fontSize=15#字体大小ct.leading=30#行间距aract.textColor=colors.red#字体颜色Purnret#创建标题对应的段落并返回(title,ct)#绘制普通段落内容@staticmethoddefdraw_text(text:str):#获取所有样式表style=getSamPleStylesheet()#获取普通样式ct=style['normal']ct.fontname='simsun'ct.fontsize=12ct.wordwrap='cjk'#设置自动切换ct.alignment=0#左对齐对齐。32#第一行开头CT.Leading=25ReturnParagraph(text,CT)#绘图形式@StaticMethoddefDraw_table(*ARGS):#columnwidthcolor=120style=[('fontname',(0,0),(-1,-1),'SimSun'),#字体('FONTSIZE',(0,0),(-1,0),12),#第一行的字体大小('FONTSIZE',(0,1),(-1,-1),10),#从第二行到最后一行的字体大小('BACKGROUND',(0,0),(-1,0),'#d5dae6'),#设置第一行的背景色('ALIGN',(0,0),(-1,-1),'CENTER'),#第一行水平居中('ALIGN',(0,1),(-1,-1),'LEFT'),#从第二行到最后一行左右对齐('VALIGN',(0,0),(-1,-1),'MIDDLE'),#所有表格上下居中对齐('TEXTCOLOR',(0,0),(-1,-1),colors.darkslategray),#设置表格中的文字颜色('GRID',(0,0),(-1,-1),0.5,colors.grey),#设置表格框线为灰色,线宽0.5#('SPAN',(0,1),(0,2)),#合并第一列、第二行和第三行#('SPAN',(0,3),(0,4)),#合并第一列三四行#('SPAN',(0,5),(0,6)),#合并第一列column五六行#('SPAN',(0,7),(0,8)),#合并第一列,五六行]table=Table(args,colWidths=col_width,style=style)returntable#创建图表@staticmethoddefdraw_bar(bar_data:list,ax:list,items:list):drawing=Drawing(500,250)bc=VerticalBarChart()bc.x=45#整个图表的x坐标bc.y=45整个图表的y坐标.height=200#图表的高度bc.width=350#图表的宽度bc.data=bar_databc.strokecolor=colors.black#topandrightaxis.bc.valueAxis.valueMax=26000#设置y坐标的最大值bc.valueAxis.valueStep=2000#设置y坐标的步长bc.categoryAxis.labels.dx=2bcdy.bcdy8.labels.label=goryaxis.labels.angle=20bc.categoryaxis.categorynames=ax#iconleg=legend()leg.fontname='Simsun'Leg.alignment='Right'Leg.boxanchor='Neg.X.的x坐标leg.y=240leg.dxtextspace=10leg.columnmaximum=3leg.colornamepairs=itemsdraws.add(leg)draw.add(bc)返回drawing#@staticmethod@staticmethoddefdrewdrak_img(path):img=img=image(path)#读指定路径下的图片img.drawWidth=5*cm#设置图片的宽度img.drawHeight=8*cm#设置图片的高度returnimggeneratereportif__name__=='__main__':create#空列表对应内容content=list()#添加标题content.append(Graphs.draw_title('数据分析就业薪资'))#添加图片content.append(Graphs.draw_img('抗疫必胜.png'))#添加段落内容content.append(Graphs.draw_text('众所周知,大数据分析师这个职位很吃香,近年来数据分析席卷全球t整个互联网行业。与数据分析相关的招聘和培训不计其数。很多人往前走,想参与这波红利。那么数据分析师的工作前景如何呢?'))#添加小标题content.append(Graphs.draw_title(''))content.append(Graphs.draw_little_title('不同级别的平均工资'))#添加表格数据=[('JobTitle','Average薪酬','同比增长率'),('数据分析师','18.5K','25%'),('高级数据分析师','25.5K','14%'),('高级数据分析师','29.3K','10%')]content.append(Graphs.draw_table(*data))#生成图表content.append(Graphs.draw_title(''))content.append(Graphs.draw_little_title('热门城市就业情况'))b_data=[(25400,12900,20100,20300,20300,17400),(15800,9700,12982,9283,13900,7623)]ei',ei'B='成都','深圳','上海','杭州','南京']leg_items=[(colors.red,'平均工资'),(colors.green,'招聘量')]content.append(Graphs.draw_bar(b_data,ax_data,leg_items))#生成pdf文件doc=SimpleDocTemplate('report.pdf',pagesize=letter)doc.build(content)生成报告的结果如下:最近花了几天时间,我编译器主导了Python入门理论+实践进阶教程,这可能是你见过的最好的学习资料之一。独家打造,完全免费,需要的同学可以到gzh【Python编程学习圈】发“学习资料”获取~
