乐于分享
好东西不私藏

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

从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": [12], "y": [34]})

# 2. 创建PDF画布
c = canvas.Canvas("small11.pdf")

# 3. 手动绘制表格内容
c.drawString(50750"x y")    # 表头
c.drawString(50730"1 3")    # 第一行数据
c.drawString(50710"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": [12], "y": [34]})

创建一个简单的2行2列的DataFrame:

  • x:1, 2
  • y:3, 4

3. 创建PDF画布

c = canvas.Canvas("small11.pdf")

创建一个PDF画布对象,参数为输出文件名。默认页面大小为A4(595×842点)。

4. 绘制内容

c.drawString(50750"x y")    # 表头
c.drawString(50730"1 3")    # 第一行数据
c.drawString(50710"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({
"姓名": ["张三""李四""王五"],
"年龄": [253035],
"城市": ["北京""上海""广州"]
})

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生成的图表图片。


注意事项

  1. 坐标计算:手动计算坐标容易出错,建议封装成函数自动计算
  2. 中文字体:默认字体不支持中文,需要注册中文字体

    from reportlab.pdfbase import pdfmetrics
    from reportlab.pdfbase.ttfonts import TTFont

    pdfmetrics.registerFont(TTFont('SimHei''SimHei.ttf'))
    c.setFont('SimHei'10)
  3. 性能考虑:大量数据时建议分批处理,或使用platypus模块的表格组件

总结

从这段简单的代码开始,你已经掌握了用Python生成PDF的基础。无论是生成数据报表、自动化周报,还是创建PDF格式的发票,ReportLab都是一个强大而灵活的工具。

记住三个关键步骤

  1. 创建Canvas对象
  2. drawString等方法绘制内容
  3. 调用save()保存文件

下次当你需要将DataFrame分享为PDF时,不用再手动复制粘贴了——让Python帮你自动完成!


为什么正态分布如此重要?
Python进阶:彻底搞懂*args和**kwargs是什么?
贝叶斯学派与频率学派如何共塑现代数据分析
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 从Pandas DataFrame到PDF:用Python轻松生成数据报表

评论 抢沙发

9 + 3 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮