0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

reportlab如何输入Python的第三方库

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-08-08 10:35 次阅读

reportlab是Python的一个标准库,可以画图、画表格、编辑文字,最后可以输出PDF格式。它的逻辑和编辑一个word文档或者PPT很像。有两种方法:

1)建立一个空白文档,然后在上面写文字、画图等;

2)建立一个空白list,以填充表格的形式插入各种文本框、图片等,最后生成PDF文档。

因为需要产生一份给用户看的报告,里面需要插入图片、表格等,所以采用的是第二种方法。

安装第三方库

reportlab输入Python的第三方库,使用前需要先安装:pip install reportlab

模块导入

提前导入相关内容,并且注册字体。(注册字体前需要先准备好字体文件)

fromreportlab.pdfbaseimportpdfmetrics#注册字体
fromreportlab.pdfbase.ttfontsimportTTFont#字体类
fromreportlab.platypusimportTable,SimpleDocTemplate,Paragraph,Image#报告内容相关类
fromreportlab.lib.pagesizesimportletter#页面的标志尺寸(8.5*inch,11*inch)
fromreportlab.lib.stylesimportgetSampleStyleSheet#文本样式
fromreportlab.libimportcolors#颜色模块
fromreportlab.graphics.charts.barchartsimportVerticalBarChart#图表类
fromreportlab.graphics.charts.legendsimportLegend#图例类
fromreportlab.graphics.shapesimportDrawing#绘图工具
fromreportlab.lib.unitsimportcm#单位:cm

#注册字体(提前准备好字体文件,如果同一个文件需要多种字体可以注册多个)
pdfmetrics.registerFont(TTFont('SimSun','SimSun.ttf'))

封装不同内容对应的函数

创建一个Graphs类,通过不同的静态方法提供不同的报告内容,包括:标题、普通段落、图片、表格和图表。函数中的相关数据目前绝大多数都是固定值,可以根据情况自行设置成相关参数

classGraphs:
#绘制标题
@staticmethod
defdraw_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
#创建标题对应的段落,并且返回
returnParagraph(title,ct)

#绘制小标题
@staticmethod
defdraw_little_title(title:str):
#获取所有样式表
style=getSampleStyleSheet()
#拿到标题样式
ct=style['Normal']
#单独设置样式相关属性
ct.fontName='SimSun'#字体名
ct.fontSize=15#字体大小
ct.leading=30#行间距
ct.textColor=colors.red#字体颜色
#创建标题对应的段落,并且返回
returnParagraph(title,ct)

#绘制普通段落内容
@staticmethod
defdraw_text(text:str):
#获取所有样式表
style=getSampleStyleSheet()
#获取普通样式
ct=style['Normal']
ct.fontName='SimSun'
ct.fontSize=12
ct.wordWrap='CJK'#设置自动换行
ct.alignment=0#左对齐
ct.firstLineIndent=32#第一行开头空格
ct.leading=25
returnParagraph(text,ct)

#绘制表格
@staticmethod
defdraw_table(*args):
#列宽度
col_width=120
style=[
('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),#设置表格框线为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

#创建图表
@staticmethod
defdraw_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_data
bc.strokeColor=colors.black#顶部和右边轴线的颜色
bc.valueAxis.valueMin=5000#设置y坐标的最小值
bc.valueAxis.valueMax=26000#设置y坐标的最大值
bc.valueAxis.valueStep=2000#设置y坐标的步长
bc.categoryAxis.labels.dx=2
bc.categoryAxis.labels.dy=-8
bc.categoryAxis.labels.angle=20
bc.categoryAxis.categoryNames=ax

#图示
leg=Legend()
leg.fontName='SimSun'
leg.alignment='right'
leg.boxAnchor='ne'
leg.x=475#图例的x坐标
leg.y=240
leg.dxTextSpace=10
leg.columnMaximum=3
leg.colorNamePairs=items
drawing.add(leg)
drawing.add(bc)
returndrawing

#绘制图片
@staticmethod
defdraw_img(path):
img=Image(path)#读取指定路径下的图片
img.drawWidth=5*cm#设置图片的宽度
img.drawHeight=8*cm#设置图片的高度
returnimg

生成报告

if__name__=='__main__':
#创建内容对应的空列表
content=list()

#添加标题
content.append(Graphs.draw_title('数据分析就业薪资'))

#添加图片
content.append(Graphs.draw_img('抗疫必胜.png'))

#添加段落文字
content.append(Graphs.draw_text('众所周知,大数据分析师岗位是香饽饽,近几年数据分析热席卷了整个互联网行业,与数据分析的相关的岗位招聘、培训数不胜数。很多人前赴后继,想要参与到这波红利当中。那么数据分析师就业前景到底怎么样呢?'))
#添加小标题
content.append(Graphs.draw_title(''))
content.append(Graphs.draw_little_title('不同级别的平均薪资'))
#添加表格
data=[
('职位名称','平均薪资','较上年增长率'),
('数据分析师','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=['BeiJing','ChengDu','ShenZhen','ShangHai','HangZhou','NanJing']
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)

生成报告的结果如下:

aa37216a-1593-11ed-ba43-dac502259ad0.png

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3866

    浏览量

    61308
  • PDF
    PDF
    +关注

    关注

    1

    文章

    163

    浏览量

    33005
  • python
    +关注

    关注

    51

    文章

    4674

    浏览量

    83462

原文标题:Python生成图文并茂的PDF报告

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Labview如何内嵌操作第三方EXE程序!

    自己在网上搜了下相关资料,能把第三方EXE内嵌进入容器里,但是有个问题,这个第三方软件必须手动拖到容器正中间,手动最大化。请问有什么方法可以自动实现吗? 下图是我内嵌的POLL 软件。如图!
    发表于 04-18 14:26

    stm32H743IIT6串口2跟第三方设备通讯,不插USB就通讯不了怎么解决?

    stm32H743IIT6串口2跟第三方设备通讯。插上USB就可以通讯,不插USB就通讯不了,有没有大神帮忙解决下
    发表于 03-22 06:42

    Meta Quest头显将支持多款安卓第三方应用并行

    Meta已悄然启动了与此相关的功能,意味着Quest头显可同时操作多个第三方Android应用。在此之前,Quest对第三方Android应用有严格限制,用户每次仅能打开一个,无法实现同屏幕并行多个第三方应用进程。
    的头像 发表于 03-11 10:58 215次阅读

    使用cubemx 生成usb驱动和配置第三方fatfs,fread读取大于100k的文件,会超时的原因?

    使用cubemx 生成usb驱动和配置第三方fatfs,打开文件没有报错,使用fread读取文件的时候大于100k的文件,会读超时,小于100k正常读完,为什么
    发表于 03-07 06:35

    python第三方库有哪些

    Python 作为一门功能强大的编程语言,拥有丰富的第三方库,几乎覆盖了各个领域的应用。下面是一些常见且广泛应用的 Python 第三方库的总结,希望能为您提供帮助。 NumPy(Nu
    的头像 发表于 11-29 14:31 813次阅读

    OpenAtom OpenHarmony 三方创建发布及安全隐私检测

    密码。 请将公钥上传至OpenHarmony三方中心仓【个人中心】-【认证管理】下:点击页面左上角的“新增”按钮,并将公钥文件(mykey.pub)的内容粘贴到公钥输入框中。 请将对应私钥文件路径
    发表于 11-13 17:27

    Tablib:一个Python第三方数据导出模块

    Tablib是一个Python第三方数据导出模块,它支持以下文件格式的导出: Excel JSON YAML Pandas DataFrames HTML Jira TSV ODS CSV DBF
    的头像 发表于 11-02 15:57 425次阅读
    Tablib:一个<b class='flag-5'>Python</b>的<b class='flag-5'>第三方</b>数据导出模块

    yfinance:获取数据的Python第三方模块

    yfinance 是一个使用 Yahoo! 获取数据的 Python 第三方模块。它支持获取最细到1分钟级的历史数据及股票基本面数据,是免费获得美股分钟级及以上粒度数据的不二之选。 1.准备 开始
    的头像 发表于 10-21 14:32 996次阅读

    最受欢迎的第三方平台——呼叫中心系统

    中小企业一定要选择正规的呼叫中心供应商,只有应有强大的第三方合作平台,才能拥有更专业的系统团队以及系统维护平台,只有可信的团队才能为企业带来良好的业绩。 本公司呼叫中心系统凭借多年的呼叫中心
    发表于 09-20 17:54

    Python第三方的安装#Python

    程序函数python
    未来加油dz
    发布于 :2023年08月30日 18:56:34

    如何在蜂鸟处理器核的基础上扩展第三方指令?

    想咨询一下如何在蜂鸟处理器核的基础上扩展第三方指令,使用户自定义指令,并如何构建机器码等内容? 我看了胡老师的RISC-V处理器设计的书里面讲的使用custom1-4来进行扩展,并以EAI为实例进行
    发表于 08-16 07:36

    如何确定OpenVINO中第三方组件的相关许可?

    无法确定 OpenVINO™中第三方组件的相关许可。
    发表于 08-15 06:45

    学会安装第三方开源库

    你好,我是爱吃鱼香ROS的小鱼。秉承着拒绝重复造轮子的ROS精神,本节我们学习如何在我们的工程里安装第三方开源库。
    的头像 发表于 07-13 14:35 624次阅读
    学会安装<b class='flag-5'>第三方</b>开源库

    第三方供应商风险评估|不要单独管理第三方风险|虹科分享

    使用ProcessUnity和虹科网络安全评级的整体方法保护您的供应商生态系统赛义亚研究所的一项新研究发现,98%的组织与遭受入侵的第三方有业务往来。报告还发现,公司平均有11个第三方关系,以及数百
    的头像 发表于 05-31 09:34 561次阅读
    <b class='flag-5'>第三方</b>供应商风险评估|不要单独管理<b class='flag-5'>第三方</b>风险|虹科分享

    在SpringBoot中重试调用第三方API教程

    作为后端程序员,我们的日常工作就是调用一些第三方服务,将数据存入数据库,返回信息给前端。但你不能保证所有的事情一直都很顺利。像有些第三方API,偶尔会出现超时。此时,我们要重试几次,这取决于你的重试策略。
    的头像 发表于 05-11 10:43 476次阅读