Python 自动化导出PDF表格:List、Dictionary、Pandas DataFrame和数据库实例演示 - 指南

news/2025/10/3 11:12:44/文章来源:https://www.cnblogs.com/lxjshuju/p/19124406

目录

前言

一、环境准备

二、将列表(List)导出为 PDF 表格

三、将字典(Dictionary)导出为 PDF 表格

四、将Pandas DataFrame 导出为 PDF 表格

五、将数据库(Database)导出为 PDF 表格

六、自定义表格样式

七、合并单元格

八、总结


前言

在日常的数据处理和报告生成中,很多场景都需要将数据以表格的形式导出为 PDF 文件。例如,销售报表、库存清单、财务对账单、数据库查询结果等。相比 Excel,PDF 文件更适合跨平台共享,格式统一,不易被随意修改。因此,使用 Python 将数据自动化导出到 PDF 表格,可以大大提高工作效率。

本文将介绍如何使用 Python 将列表(List)、字典(Dictionary)、Pandas DataFrame 和数据库(Database)四种数据源的数据导出为 PDF 表格。每一部分都包含详细的步骤说明和完整示例代码,帮助你快速掌握实现方法。

一、环境准备

在开始之前,需要准备 Python 开发环境,并安装合适的 PDF 文档生成和处理库。这篇文章所使用的是 Spire.PDF for Python 库。

Spire.PDF for Python 简介

Spire.PDF for Python 是一款多功能的 PDF 文档操作库,可以用来创建、读取、编辑PDF文档,生成表格、绘制文本和图片、添加水印和签名等。使用该库可以方便地将各种数据源生成专业的 PDF 报表。

首先需要安装并导入 Spire.PDF 库:

pip install spire.pdf

如果你已安装旧版本,可以使用以下命令升级:

pip install --upgrade spire.pdf

安装完成后,就可以使用该库提供的类来创建和自定义 PDF 表格。

二、将列表(List)导出为 PDF 表格

在 Python 中,列表(List)是一种常见的数据结构,可以存储一维或二维数据。要将列表中的数据写入 PDF 表格,可以通过以下步骤实现:

  • 使用 PdfDocument() 创建 PDF 文档对象。 
  • 调用 PdfDocument.Pages.Add() 添加页面。 
  • 使用 PdfGrid() 创建表格对象。 
  • 调用 PdfGrid.Columns.Add(len(data[0])) 给表格添加列,列数与列表首行一致。
  • 设置列宽与表格字体。
  • 遍历列表的每一行,使用PdfGrid.Rows.Add() 给表格添加行。
  • 遍历当前行的每一个数据,使用PdfGridRow.Cells[i].Value 依次将数据赋值给表格的对应单元格。
  • 使用 PdfGrid.Draw() 方法将表格绘制到指定坐标位置。 
  • 使用PdfDocument.SaveToFile()方法保存结果文档。

实现代码:

from spire.pdf import *
# 定义列表数据
data = [["编号", "姓名", "部门"],["1", "张三", "人事部"],["2", "李四", "信息技术部"],["3", "王五", "财务部"]
]
# 创建 PDF 文档并添加 A4 页面
pdf = PdfDocument()
page = pdf.Pages.Add(PdfPageSize.A4())
# 创建表格,列数与列表首行一致
grid = PdfGrid()
grid.Columns.Add(len(data[0]))
# 设置列宽
column_widths = [50, 100, 120]
for i, width in enumerate(column_widths):grid.Columns[i].Width = width
# 设置字体
grid.Style.Font = PdfTrueTypeFont("宋体", 13.0, 0, True)
# 填充数据
for row_data in data:row = grid.Rows.Add()for i, val in enumerate(row_data):row.Cells[i].Value = val
# 绘制表格
grid.Draw(page, PointF(10.0, 50.0))
# 保存 PDF 文件
pdf.SaveToFile("列表.pdf")
pdf.Close()

三、将字典(Dictionary)导出为 PDF 表格

字典(Dictionary)是一种键值对数据结构,用于存储复杂信息。当字典包含列表或子字典时,需要先转换为字符串。

以下是将字典导出为 PDF 表格的具体实现步骤:

  • 定义辅助函数 format_value,用于将字典中的子字典或列表转换为字符串,方便在表格中显示。
  • 使用 PdfDocument() 创建 PDF 文档对象。
  • 调用 PdfDocument.Pages.Add() 添加页面。
  • 使用 PdfGrid() 创建表格对象,列数通常分为“字段”和“值”两列。
  • 设置列宽和表格字体。
  • 添加表头行。
  • 遍历字典,将键和值填入表格,子字典和列表先转换为字符串。
  • 使用 PdfGrid.Draw() 绘制表格。
  • 使用 PdfDocument.SaveToFile() 保存 PDF。

实现代码:

from spire.pdf import *
# 辅助函数,将字典中的列表、子字典转换为字符串
def format_value(val):if isinstance(val, dict):return ", ".join(f"{k}: {v}" for k, v in val.items())elif isinstance(val, list):return ", ".join(str(v) for v in val)else:return str(val)
# 示例字典数据
data = {"姓名": "张三","年龄": 28,"部门": "人事部","技能": ["Python", "Excel"],"项目": {"项目1": "完成", "项目2": "进行中"}
}
# 创建 PDF 文档
pdf = PdfDocument()
page = pdf.Pages.Add(PdfPageSize.A4())
# 定义表格列名
columns = ["字段", "值"]
grid = PdfGrid()
grid.Columns.Add(len(columns))
# 设置列宽
column_widths = [100, 300]
for i, width in enumerate(column_widths):grid.Columns[i].Width = width
# 设置表格字体
grid.Style.Font = PdfTrueTypeFont("宋体", 13.0, 0, True)
# 添加表头
header = grid.Rows.Add()
for i, col in enumerate(columns):header.Cells[i].Value = col
# 添加字典数据到表格
for key, value in data.items():row = grid.Rows.Add()row.Cells[0].Value = keyrow.Cells[1].Value = format_value(value)
# 绘制表格
grid.Draw(page, PointF(10.0, 50.0))
# 保存 PDF
pdf.SaveToFile("字典.pdf")
pdf.Close()

四、将Pandas DataFrame 导出为 PDF 表格

Pandas DataFrame 是二维表格数据结构,可用于分析和报表。导出步骤如下:

  • 使用 PdfDocument() 创建 PDF 文档对象。
  • 调用 PdfDocument.Pages.Add() 添加页面。
  • 使用 PdfGrid() 创建表格对象,列数与 DataFrame 列数一致。
  • 设置列宽和字体。
  • 添加表头行。
  • 遍历 DataFrame 行,将数据填入表格。
  • 使用 PdfGrid.Draw() 绘制表格。
  • 使用 PdfDocument.SaveToFile() 保存 PDF。

实现代码:

import pandas as pd
from spire.pdf import *
# 创建示例 DataFrame
df = pd.DataFrame({"姓名": ["张三", "李四", "王五"],"年龄": [28, 34, 29],"部门": ["人事部", "信息技术部", "财务部"]
})
# 创建 PDF 文档
pdf = PdfDocument()
page = pdf.Pages.Add(PdfPageSize.A4())
# 创建表格对象,列数与 DataFrame 列数一致
grid = PdfGrid()
grid.Columns.Add(len(df.columns))
# 设置列宽
column_widths = [100, 50, 120]
for i, width in enumerate(column_widths):grid.Columns[i].Width = width
# 设置表格字体
grid.Style.Font = PdfTrueTypeFont("宋体", 13.0, 0, True)
# 添加表头
header = grid.Rows.Add()
for i, col in enumerate(df.columns):header.Cells[i].Value = col
# 遍历 DataFrame 行,添加数据
for _, row_data in df.iterrows():row = grid.Rows.Add()for i, val in enumerate(row_data):row.Cells[i].Value = str(val)  # 将值转换为字符串
# 绘制表格
grid.Draw(page, PointF(10.0, 50.0))
# 保存 PDF
pdf.SaveToFile("DataFrame.pdf")
pdf.Close()

五、将数据库(Database)导出为 PDF 表格

数据库数据可以通过 SQL 查询获取后生成报表。这里以SQLite数据库为例,导出步骤如下:

  • 使用 sqlite3 连接数据库并执行查询。
  • 使用 PdfDocument() 创建 PDF 文档对象。
  • 调用 PdfDocument.Pages.Add() 添加页面。
  • 使用 PdfGrid() 创建表格对象,列数与查询结果列数一致。
  • 设置列宽和字体。
  • 添加表头行。
  • 遍历查询结果,将数据填入表格。
  • 使用 PdfGrid.Draw() 绘制表格。
  • 使用 PdfDocument.SaveToFile() 保存 PDF。
  • 关闭数据库连接。

实现代码:

import sqlite3
from spire.pdf import *
# 创建数据库并添加示例数据
conn = sqlite3.connect(":memory:")
cursor = conn.cursor()
cursor.execute("CREATE TABLE products (产品ID INT, 产品名称 TEXT, 库存量 INT)")
cursor.executemany("INSERT INTO products VALUES (?, ?, ?)", [(101, "笔记本电脑", 50),(102, "显示器", 30),(103, "键盘", 150),(104, "鼠标", 200)
])
conn.commit()
# 查询数据
cursor.execute("SELECT * FROM products")
data = cursor.fetchall()
columns = [desc[0] for desc in cursor.description]  # 获取列名
# 创建 PDF 文档
pdf = PdfDocument()
page = pdf.Pages.Add(PdfPageSize.A4())
# 创建表格
grid = PdfGrid()
grid.Columns.Add(len(columns))
# 设置列宽
column_widths = [80, 200, 80]
for i, width in enumerate(column_widths):grid.Columns[i].Width = width
# 设置字体
grid.Style.Font = PdfTrueTypeFont("宋体", 13.0, 0, True)
# 添加表头
header = grid.Rows.Add()
for i, col in enumerate(columns):header.Cells[i].Value = col
# 添加数据行
for row_data in data:row = grid.Rows.Add()for i, val in enumerate(row_data):row.Cells[i].Value = str(val)
# 绘制表格
grid.Draw(page, PointF(10.0, 50.0))
# 保存 PDF
pdf.SaveToFile("数据库.pdf")
pdf.Close()
# 关闭数据库连接
conn.close()

六、自定义表格样式

通过设置字体、单元格填充颜色、边框和对齐方式,可以让 PDF 表格更美观、专业,适合报表、发票或数据摘要。

实现代码:

from spire.pdf import *
# 表格数据
data = [["编号", "姓名", "部门"],["1", "张三", "人事部"],["2", "李四", "信息技术部"],["3", "王五", "财务部"]
]
# 创建 PDF 文档
pdf = PdfDocument()
page = pdf.Pages.Add(PdfPageSize.A4())
# 创建表格
grid = PdfGrid()
grid.Columns.Add(len(data[0]))
# 设置列宽
column_widths = [50, 100, 120]
for i, width in enumerate(column_widths):grid.Columns[i].Width = width
# 设置表格字体
grid.Style.Font = PdfTrueTypeFont("宋体", 12.0, 0, True)
# 添加表头并设置样式
header = grid.Rows.Add()
for i, val in enumerate(data[0]):cell = header.Cells[i]cell.Value = valcell.StringFormat.Alignment = PdfTextAlignment.Center  # 水平居中cell.Style.BackgroundBrush = PdfBrushes.get_LightGray()  # 灰色背景cell.Style.Font = PdfTrueTypeFont("宋体", 12.0, 1, True)  # 加粗字体cell.Style.Borders.All = PdfPen(PdfRGBColor(Color.get_Black()), 0.1)  # 设置边框
# 添加数据行并设置样式
for row_data in data[1:]:row = grid.Rows.Add()for i, val in enumerate(row_data):cell = row.Cells[i]cell.Value = valcell.StringFormat.Alignment = PdfTextAlignment.Center  # 水平居中cell.Style.Font = PdfTrueTypeFont("宋体", 11.0, 0, True)  # 常规字体cell.Style.Borders.All = PdfPen(PdfRGBColor(Color.get_Black()), 0.1)  # 设置边框
# 绘制表格
grid.Draw(page, PointF(10.0, 50.0))
# 保存 PDF
pdf.SaveToFile("自定义表格样式.pdf")
pdf.Close()

七、合并单元格

在生成 PDF 表格时,有时需要合并行或列,以便更清晰地展示信息,例如表头跨多列、或多行同类信息合并。下面示例演示了 水平合并(列合并) 和 垂直合并(行合并) 的用法。

实现代码:

from spire.pdf import *
# 创建 PDF 文档
pdf = PdfDocument()
page = pdf.Pages.Add(PdfPageSize.A4())
# 创建表格对象,3列
grid = PdfGrid()
grid.Columns.Add(3)
# 设置列宽
for i, width in enumerate([100, 100, 100]):grid.Columns[i].Width = width
# 设置字体
grid.Style.Font = PdfTrueTypeFont("宋体", 12.0, 0, True)
# 添加表头
header = grid.Rows.Add()
header.Cells[0].Value = "序号"
header.Cells[1].Value = "姓名"
header.Cells[2].Value = "部门"
# 添加数据行
row1 = grid.Rows.Add()
row1.Cells[0].Value = "1"
row1.Cells[1].Value = "张三"
row1.Cells[2].Value = "人事部"
row2 = grid.Rows.Add()
row2.Cells[0].Value = "2"
row2.Cells[1].Value = "李四"
row2.Cells[2].Value = "信息技术部"
row3 = grid.Rows.Add()
row3.Cells[0].Value = "3"
row3.Cells[1].Value = "王五"
row3.Cells[2].Value = "财务部"
# 水平合并示例:合并第4行第2列和第3列
row4 = grid.Rows.Add()
row4.Cells[0].Value = "4"
row4.Cells[1].Value = "合并部门"
row4.Cells[1].ColumnSpan = 2  # 水平合并两列
# 垂直合并示例:合并第5、6行的第一列
row5 = grid.Rows.Add()
row5.Cells[0].Value = "5-6合并"
row5.Cells[1].Value = "赵六"
row5.Cells[2].Value = "研发部"
row6 = grid.Rows.Add()
row6.Cells[1].Value = "钱七"
row6.Cells[2].Value = "市场部"
# 正确的垂直合并方法
row5.Cells[0].RowSpan = 2  # 合并 row5 和 row6 的第一列
# 绘制表格
grid.Draw(page, PointF(10.0, 50.0))
# 保存 PDF
pdf.SaveToFile("合并单元格.pdf")
pdf.Close()

八、总结

本文介绍了如何使用 Python 将不同类型的数据自动化导出为 PDF 表格,包括列表(List)、字典(Dictionary)、Pandas DataFrame 以及数据库查询结果。通过示例展示了从创建 PDF 文档、添加页面、构建表格、设置列宽和字体,到填充数据和绘制表格的完整流程。同时,还介绍了自定义表格样式和合并单元格的方法,使生成的 PDF 报表更美观、专业。掌握这些方法后,可以方便地生成各类报表和数据文档,提高日常数据处理和报表制作的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust Slint库达成桌面萌宠源码分享(包含拖动、右键菜单效果)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Redis 持久化机制 - 教程

Redis 持久化机制 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…

行业seo网站优化方案厦门优化公司

文章目录 背景介绍 问题描述 分析排查 解决方案 总结归纳 背景介绍 在一个嵌入式软件项目中,有一段使用C语言写的嵌入式代码,功能是把CAN总线上的几帧报文接收进来,并解析出数据。示例如下: 乍一看感觉挺简单,想着…

网站建站图片汉滨区住房和城乡建设局网站

在进行绘图时必须考虑这两种坐标。 世界坐标是整个区域的坐标,而页面坐标是可视区的坐标。这两种坐标是通过滚动条来体现出来的。 页面坐标的原点始终是窗口可视区的坐上角,世界坐标的原点始终不变,这两种坐标和VC中的屏幕坐标和客户坐标很…

2025染井吉野樱公司 TOP 种植服务推荐排行榜,染井吉野樱花苗,五公分染井吉野樱,十公分染井吉野樱,染井吉野樱批发,染井吉野樱基地,染井吉野樱花树公司推荐

引言在樱花苗木采购与景观工程实施过程中,分枝点规格的把控已成为行业突出痛点。当前市场上,染井吉野樱苗木分枝点标准混乱,从 0.5 米到 3 米不等的规格随意标注,缺乏统一规范,导致采购方难以精准匹配绿化需求。部…

网站建设如何定价广州网站制作怎样

Facebook广告是海外营销的一大利器,但是随着互联网的发展,有部分不法分子正在利用他进行盈利,导致Facebook官方安全审核日益严格,不少卖家遭遇封号问题!这篇文章就来教你如何更好地管理 Facebook广告帐户,实…

如何建立自己的摄影网站做电商网站用什么框架

来源:AI前线 作者:Jiang Chen,Moveworks 机器学习副总裁译者:王强策划:刘燕从 Siri 到 Alexa 再到谷歌助手,今天我们已经被各种人工智能系统包围了。它们的设计目标只有一个:理解我们。我们已经…

鄂州网站建设与设计乐器网站模板

windows2003-建立域 Active Directory建立DNS建立域查看日志xp 加入域 Active Directory 活动目录是一个包括文件、打印机、应用程序、服务器、域、用户账户等对象的数据库。 常见概念:对象、属性、容器 域组件(Domain Component,DC&#x…

glazewm_windows平铺窗口管理器使用方法

1.在github上寻找预构建版本 2.双击安装 3.关闭与zebra有关的命令 配置文件在 C:\Users{yourname}.glzr\glazewm\config.yaml 打开这个文件 默认这条指令是没有注释的,我这边直接注释掉这样软件启动就不会报错了4.添加…

详细介绍:LeetCode热题100(1-7)

详细介绍:LeetCode热题100(1-7)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

树莓派搭建NAS之三:使用OpenList挂载网盘

移动硬盘中发现有之前备份的文件,并且监控是一直在写盘,容易将磁盘写坏,之前备份的数据就无法读出。找了半天找到了个不用的32GB的U盘,可以先用着。 U盘的空间太小,连续录制1-2天的时间就会满了,之前的监控也无法…

sg-ss 逆向分析

sg-ss、sgss声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! wx a15018601872 q 27…

网站建设报价比较深圳团购网站设计

在前端Web开发中,下拉筛选功能是一种非常常见的交互方式,它可以帮助用户快速选择所需的选项。本文将介绍如何利用Vue.js和uni-app框架来实现一个高效的下拉筛选功能。通过使用这两个强大的前端框架,我们可以轻松地创建具有响应式用户操作的下…

PySide6 之登录界面设计

一、效果图二、示例代码from PySide6.QtWidgets import QApplication, QWidget from PySide6.QtCore import Qt, Slot, QPoint, QPropertyAnimation, QEasingCurve from PySide6.QtGui import QColorfrom views.login…

Jupyter notebook 虚拟环境(服务)EnvironmentLocationNotFound: Not a conda environment

ErrorAn error occurred while retrieving installed packages. EnvironmentLocationNotFound: Not a conda environment: E:\Eprogramfiles\Anaconda3\envs\Anaconda3 ================================ 网上说修改文…

本地部署overleaf服务帮助latex论文编写 —— 操作笔记

本地部署overleaf服务帮助latex论文编写 —— 操作笔记原文参照: https://www.cnblogs.com/xuhe2/p/18792632操作: git clone https://github.com/xuhe2/sharelatex-ce本博客是博主个人学习时的一些记录,不保证是为…

简述网站开发的三层架构中国建设银行网站转账

近用到Java动态生成背景透明的图片功能,从gif和png中选择了png格式,个中缘由就不说了,于是动手到网上搜索有用的代码。现把搜索结果总结如下:1. 生成png图片int width 400;int height 300;// 创建BufferedImage对象BufferedImag…

怎么免费建立网站广告设计制作公司简介

1. 张量概念 张量本质上是一个n维数组,它在numpy中为ndarray, 在pytorch中称为tensor , 两者的区别在于: numpy仅支持CPU计算tensor能支持GPU运算,并且支持自动微分,更适合深度学习 2. 张量的访问 一个二维矩阵a&a…

【Groovy】Array、List、Set、Map简介

1 Array 1.1 创建数组 1.1.1 创建一维数组 int[] arr1 = new int[2] arr1[0] = 1 arr1[1] = 2float[] arr2 = new float[] { 1f, 2f, 3f } String[] arr3 = ["abc", "xyz"] as String[]1.1.2 创建…

深入解析:【Python高级语法与正则表达式】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …