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#Unit:cm#注册字体(提前准备好字体文件),如果同一个文件可以注册多种字体)pdfmetrics.registerFont(TTFont('SimSun','SimSun.ttf'))封装不同内容对应的函数创建一个Graphs类,提供不同的报表c通过不同的静态方法显示内容,包括:标题、一般段落、图片、表格和图表。目前函数中的相关数据大多是固定值,可以根据情况设置为相关参数。classGraphs:#绘制标题@staticmethoddefdraw_title(title:str):#获取所有样式表style=getSampleStyleSheet()#获取标题样式ct=style['Heading1']#单独设置样式相关属性ct.fontName='SimSun'#字体名称ct.fontSize=18#字体大小ct.leading=50#行距ct.textColor=colors.green#字体颜色ct.alignment=1#居中ct.bold=True#创建段落对应tothetitle,并返回Paragraph(title,ct)#画一个小标题@staticmethoddefdraw_little_title(title:str):#获取所有样式表style=getSampleStyleSheet()#获取标题stylect=style['Normal']#单独设置样式相关属性ct.fontName='SimSun'#字体名称ct.fontSize=15#字体大小ct.leading=30#行间距ct.textColor=colors.red#字体颜色#创建段落对应titleandreturnreturnParagraph(title,ct)#绘制普通段落内容@staticmethoddefdraw_text(text:str):#获取所有样式sheets风格=getSampleStyleSheet()#获取普通样式ct=style['Normal']ct.fontName='SimSun'ct.fontSize=12ct.wordWrap='CJK'#设置自动换行ct.alignment=0#左对齐ct.firstLineIndent=32#第一行开头的空格ct.leading=25returnParagraph(text,ct)#绘制表格@staticmethoddefdraw_table(*args):#列宽col_width=120style=[('FONTNAME',(0,0),(-1,-1),'SimSun'),#font('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'),#所有表格上下居中Alignment('TEXTCOLOR',(0,0),(-1,-1),colors.darkslategray),#设置text表格中的颜色('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)),#合并第一列五六行#('SPAN',(0,7),(0,8)),#合并第一列五六行]table=Table(args,colWidths=col_width,style=style)returntable#createchart@staticmethoddefdraw_bar(bar_data:list,ax:list,items:list):drawing=Drawing(500,250)bc=VerticalBarChart()bc.x=45#整个图表的x坐标bc.y=45#整个图表的y坐标bc.height=200#图表的高度bc.width=350#图表的宽度bc.data=bar_databc.strokeColor=colors.black#顶部的颜色和右轴bc.valueAxis.valueMin=5000#设置y坐标的最小值bc.valueAxis.valueMax=26000#设置y坐标的最大值bc.valueAxis.valueStep=2000#设置y坐标的步长bc.categoryAxis.labels.dx=2bc.categoryAxis.labels.dy=-8bc.categoryAxis.labels.angle=20bc.categoryAxis.categoryNames=ax#iconleg=Legend()leg.fontName='SimSun'leg.alignment='right'leg.boxAnchor='ne'leg.x=475#legend的x坐标leg.y=240leg.dxTextSpace=10leg.columnMaximum=3leg.colorNamePairs=itemsdrawing.add(leg)drawing.add(bc)returndrawing#drawpictures@staticmethoddefdraw_img(path):img=Image(path)#读取指定路径下的图片img.drawWidth=5*cm#设置图片宽度img.drawHeight=8*cm#设置图片高度returnimggeneratereportif__name__=='__main__':#创建内容对应的空列表content=list()#添加标题content.append(Graphs.draw_title('数据分析就业薪水'))#添加图片content.append(Graphs.draw_img('抗疫mustwin.png'))#Addparagraphtextcontent.append(Graphs.draw_text('众所周知,大数据分析师这个职位很吃香,近几年数据分析风靡整个互联网行业。与数据分析相关的工作招聘和培训数不胜数。很多人往前走,想参与这波红利。那么数据分析师的工作前景如何呢?'))#添加小标题content.append(Graphs.draw_title(''))content.append(Graphs.draw_little_title('不同级别的平均工资'))#添加表格数据=[('职位名称','平均工资','同比增长率'),('数据分析师','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)]ax_data=['北京','成都','深圳','上海','杭州','南京']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编程学习圈,每日干货分享,涵盖Python电子书、教程、数据库编程、Django、爬虫、云计算等。或者去编程学习网了解更多编程技术知识。
