从Pandas DataFrame到PDF:用Python轻松生成数据报表

手把手教你用几行代码将数据框导出为PDF文件
在数据处理工作中,我们经常需要将分析结果分享给同事或客户。虽然CSV和Excel是常见的格式,但PDF因其跨平台、不易修改的特性,在某些场景下更受欢迎。
今天,我将带你用Python实现一个简单的功能:将Pandas DataFrame转换为PDF文件。即使你从未接触过PDF生成,也能在几分钟内上手。
完整代码示例
import pandas as pd
from reportlab.pdfgen import canvas
# 1. 创建示例DataFrame
df = pd.DataFrame({"x": [1, 2], "y": [3, 4]})
# 2. 创建PDF画布
c = canvas.Canvas("small11.pdf")
# 3. 手动绘制表格内容
c.drawString(50, 750, "x y") # 表头
c.drawString(50, 730, "1 3") # 第一行数据
c.drawString(50, 710, "2 4") # 第二行数据
# 4. 保存PDF文件
c.save()
print("small11.pdf created")
运行结果:
-
生成一个名为 small11.pdf的文件 -
控制台输出: small11.pdf created -
PDF内容为: x y
1 3
2 4
代码逐行解析
1. 导入所需库
import pandas as pd
from reportlab.pdfgen import canvas
-
pandas:创建和处理DataFrame -
reportlab:Python最流行的PDF生成库,可以精确控制页面元素
2. 创建示例数据
df = pd.DataFrame({"x": [1, 2], "y": [3, 4]})
创建一个简单的2行2列的DataFrame:
-
列 x:1, 2 -
列 y:3, 4
3. 创建PDF画布
c = canvas.Canvas("small11.pdf")
创建一个PDF画布对象,参数为输出文件名。默认页面大小为A4(595×842点)。
4. 绘制内容
c.drawString(50, 750, "x y") # 表头
c.drawString(50, 730, "1 3") # 第一行数据
c.drawString(50, 710, "2 4") # 第二行数据
drawString(x, y, text)方法在指定坐标绘制文本:
-
坐标原点(0,0)在页面左下角 -
x坐标向右增加,y坐标向上增加 -
这里我们每行间隔20点(750→730→710)
5. 保存文件
c.save()
必须调用save()方法,否则PDF不会实际写入磁盘。
进阶:自动绘制任意DataFrame
手动指定每个单元格的位置显然不实用。下面是一个更通用的版本,可以自动将任意DataFrame绘制为表格:
import pandas as pd
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import inch
defdataframe_to_pdf(df, filename, title=None):
"""
将DataFrame导出为PDF表格
"""
c = canvas.Canvas(filename, pagesize=A4)
width, height = A4
# 设置字体和起始位置
c.setFont("Helvetica", 10)
x_start = 50
y_start = height - 50
row_height = 20
col_width = 60
# 绘制标题(如果有)
if title:
c.setFont("Helvetica-Bold", 14)
c.drawString(x_start, y_start, title)
y_start -= row_height * 2
c.setFont("Helvetica-Bold", 10)
# 绘制表头
for i, col in enumerate(df.columns):
c.drawString(x_start + i * col_width, y_start, str(col))
# 绘制数据行
y_start -= row_height
for row_idx, row in df.iterrows():
for col_idx, value in enumerate(row):
c.drawString(x_start + col_idx * col_width, y_start, str(value))
y_start -= row_height
# 如果页面将满,创建新页
if y_start < 50:
c.showPage()
y_start = height - 50
c.setFont("Helvetica", 10)
c.save()
print(f"{filename} created")
# 使用示例
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 35],
"城市": ["北京", "上海", "广州"]
})
dataframe_to_pdf(df, "人员信息.pdf", title="员工基本信息表")
核心概念解释
ReportLab的坐标系统
-
页面左下角为(0, 0) -
右上角为(页面宽度, 页面高度) -
A4尺寸:595 × 842点(1点=1/72英寸)
常用方法
|
|
|
|---|---|
drawString(x, y, text) |
|
setFont(字体名, 字号) |
|
line(x1,y1,x2,y2) |
|
rect(x,y,width,height) |
|
showPage() |
|
扩展应用场景
1. 添加表格边框
# 在绘制表格时添加边框
c.rect(x_start - 5, y_start + 5,
col_width * len(df.columns) + 10,
-row_height * (len(df) + 1) - 10)
2. 设置不同样式
# 表头加粗
c.setFont("Helvetica-Bold", 10)
# 数据用普通字体
c.setFont("Helvetica", 10)
3. 多页表格
当数据超过一页时,自动创建新页,并重复表头。
4. 添加图表
ReportLab还支持绘制简单的图表,或插入Matplotlib生成的图表图片。
注意事项
-
坐标计算:手动计算坐标容易出错,建议封装成函数自动计算 -
中文字体:默认字体不支持中文,需要注册中文字体 from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('SimHei', 'SimHei.ttf'))
c.setFont('SimHei', 10) -
性能考虑:大量数据时建议分批处理,或使用 platypus模块的表格组件
总结
从这段简单的代码开始,你已经掌握了用Python生成PDF的基础。无论是生成数据报表、自动化周报,还是创建PDF格式的发票,ReportLab都是一个强大而灵活的工具。
记住三个关键步骤:
-
创建 Canvas对象 -
用 drawString等方法绘制内容 -
调用 save()保存文件
下次当你需要将DataFrame分享为PDF时,不用再手动复制粘贴了——让Python帮你自动完成!
夜雨聆风
