Python 自动化导出PDF表格:List、Dictionary、Pandas DataFrame和数据库实例演示
目录
前言
一、环境准备
二、将列表(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 报表更美观、专业。掌握这些方法后,可以方便地生成各类报表和数据文档,提高日常数据处理和报表制作的效率。