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

相关文章

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O