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

相关文章

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文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

C/C++随机数生成的五种方法

《C/C++随机数生成的五种方法》C++作为一种古老的编程语言,其随机数生成的方法已经经历了多次的变革,早期的C++版本使用的是rand()函数和RAND_MAX常量,这种方法虽然简单,但并不总是提供... 目录C/C++ 随机数生成方法1. 使用 rand() 和 srand()2. 使用 <random

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码