Python3用ReportLab生成pdf报表,不学何来惊喜?

2024-02-15 08:50

本文主要是介绍Python3用ReportLab生成pdf报表,不学何来惊喜?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在平时工作中,习惯了汇总与总结。汇总了相关数据后,经常会把总结内容制作成相关报表,以供领导审阅。每当见到领导发出啧啧的赞叹声时,我也就心满意足了。

可一想到,每次做的都是重复,寡淡无味的内容时,未免心里有了些许的失落,关键是领导每次都只是口头表扬两句,没有实际的行动,我想你知道我说的什么意思。

1

好在咱是程序员,可以用Python3中的ReportLab生成pdf报表,以解眼前的尴尬。若要获得ReportLab开发包的功能,需要在【终端】窗口,通过pip3 install reportlab命令进行安装,安装成功的截图在这。

2

不知你的领导是如何的,反正我的领导就喜欢看图文并茂的报表。记得有一次,实在没数据可用,我就放一张漂亮的女明星照在上面。你还别说,这招真管用,平时反馈很慢的领导,那次一看完就马上来找我了--直接劈头盖脸的把我骂了一顿,说我放的女明星是PS过的…。我一时语塞,不知怎么回答才好,只好埋下头,眼里含着泪,默默地敲出了以下代码。

from reportlab.pdfbase import pdfmetrics

from reportlab.pdfbase.ttfonts import TTFont

from reportlab.platypus import Table, SimpleDocTemplate, Paragraph

from reportlab.lib.pagesizes import letter

from reportlab.lib.styles import getSampleStyleSheet

from reportlab.lib import colors

from reportlab.graphics.charts.barcharts import VerticalBarChart

from reportlab.graphics.charts.legends import Legend

from reportlab.graphics.shapes import Drawing

 

 

# 注册字体

pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf'))

 

 

class Graphs:

    def __init__(self):

        pass

 

    # 绘制标题

    @staticmethod

    def draw_title():

        style = getSampleStyleSheet()

        ct = style['Normal']

        ct.fontName = 'SimSun'

        ct.fontSize = 18

        # 设置行距

        ct.leading = 50

        # 颜色

        ct.textColor = colors.green

        # 居中

        ct.alignment = 1

        # 添加标题并居中

        title = Paragraph('程序员的兴趣调查报告', ct)

        return title

 

    # 绘制内容

    @staticmethod

    def draw_text():

        style = getSampleStyleSheet()

        # 常规字体(非粗体或斜体)

        ct = style['Normal']

        # 使用的字体s

        ct.fontName = 'SimSun'

        ct.fontSize = 14

        # 设置自动换行

        ct.wordWrap = 'CJK'

        # 居左对齐

        ct.alignment = 0

        # 第一行开头空格

        ct.firstLineIndent = 32

        # 设置行距

        ct.leading = 30

        text = Paragraph('程序员,是互联网、移动互联网和即将到来的物联网时期的弄潮儿。'

                         '这群特立独行的人才,不知平时最喜欢什么?他们的兴趣真想让人一探究竟。'

                         '经过七七49天的调研,终于形成了一份不具备权威性的统计报告--《程序员2019年上半年兴趣调查报告》,现公布出来,以飨读者。', ct)

       return text

 

    # 绘制表格

    @staticmethod

    def draw_table(*args):

        col_width = 60

        style = [

            ('FONTNAME', (0, 0), (-1, -1), 'SimSun'),  # 字体

            ('BACKGROUND', (0, 0), (-1, 0), '#d5dae6'),  # 设置第一行背景颜色

            ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 对齐

            ('VALIGN', (-1, 0), (-2, 0), 'MIDDLE'),  # 对齐

            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),  # 设置表格框线为grey色,线宽为0.5

        ]

        table = Table(args, colWidths=col_width, style=style)

        return table

 

    # 创建图表

    @staticmethod

    def draw_bar(bar_data=[], ax=[], items=[]):

        drawing = Drawing(500, 250)

        bc = VerticalBarChart()

        bc.x = 35

        bc.y = 100

        bc.height = 120

        bc.width = 350

        bc.data = bar_data

        bc.strokeColor = colors.black

        bc.valueAxis.valueMin = 0

        bc.valueAxis.valueMax = 100

        bc.valueAxis.valueStep = 10

        bc.categoryAxis.labels.dx = 8

        bc.categoryAxis.labels.dy = -10

        bc.categoryAxis.labels.angle = 20

        bc.categoryAxis.categoryNames = ax

        # 图示

        leg = Legend()

        leg.fontName = 'SimSun'

        leg.alignment = 'right'

        leg.boxAnchor = 'ne'

        leg.x = 465

        leg.y = 220

        leg.dxTextSpace = 10

        leg.columnMaximum = 3

        leg.colorNamePairs = items

        drawing.add(leg)

        drawing.add(bc)

        return drawing

 

 

if __name__ == "__main__":

    content = list()

    # 添加标题

    content.append(Graphs.draw_title())

    # 添加段落

    content.append(Graphs.draw_text())

    # 添加表格数据

    data = [('兴趣', '2019-1', '2019-2', '2019-3', '2019-4', '2019-5', '2019-6'),

            ('开发', 50, 80, 60, 35, 40, 45),

            ('编程', 25, 60, 55, 45, 60, 80),

            ('敲代码', 30, 90, 75, 80, 50, 46)]

    content.append(Graphs.draw_table(*data))

    # 添加图表

    b_data = [(50, 80, 60, 35, 40, 45), (25, 60, 55, 45, 60, 80), (30, 90, 75, 80, 50, 46)]

    ax_data = ['2019-1', '2019-2', '2019-3', '2019-4', '2019-5', '2019-6']

    leg_items = [(colors.red, '开发'), (colors.green, '编程'), (colors.blue, '敲代码')]

    content.append(Graphs.draw_bar(b_data, ax_data, leg_items))

    # 生成pdf文件

    doc = SimpleDocTemplate('report.pdf', pagesize=letter)

    doc.build(content)

这篇关于Python3用ReportLab生成pdf报表,不学何来惊喜?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/710916

相关文章

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当