You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FPDF导出pandas DataFrame为PDF时如何实现长列名自动换行不溢出

你之前使用multi_cell失败的核心原因是FPDF的multi_cell方法默认输出完成后会自动将光标移动到下一行开头,导致每个表头列名输出后直接换行,才会出现竖排堆叠的错误效果。需要手动控制光标位置来实现同行多列的自动换行表头,以下是修正后的完整实现:

from fpdf import FPDF
import pandas as pd
import numpy as np

def output_df_to_pdf(pdf, df):
    # 可根据实际列名长度调整列宽,原13太窄放不下长列名
    table_cell_width = 25
    table_cell_height = 5
    pdf.set_font('Helvetica', 'B', 5)
    
    cols = df.columns
    # 记录表头绘制的初始坐标
    start_x = pdf.get_x()
    start_y = pdf.get_y()
    max_header_height = 0  # 记录最高的表头高度,避免后续内容重叠

    # 绘制可自动换行的表头
    for col in cols:
        pdf.set_xy(pdf.get_x(), start_y)
        # ln参数设为0,禁止multi_cell输出后自动换行
        pdf.multi_cell(table_cell_width, table_cell_height, col, align='C', border=1, ln=0)
        # 更新最大表头高度
        current_header_height = pdf.get_y() - start_y
        if current_header_height > max_header_height:
            max_header_height = current_header_height
        # 光标移动到下一列的起始位置
        pdf.set_x(pdf.get_x() + table_cell_width)
    
    # 所有表头绘制完成后,统一跳转到表头下方
    pdf.ln(max_header_height)

    # 绘制表格主体内容,逻辑保持不变
    pdf.set_font('Helvetica', '', 4)
    for row in df.itertuples():
        for col in cols:
            value = str(getattr(row, col))
            pdf.cell(table_cell_width, table_cell_height, value, align='C', border=1)
        pdf.ln(table_cell_height)

调用方式和原有逻辑一致:

# 测试用DataFrame
df = pd.DataFrame(np.random.randint(0,100,size=(8, 4)), columns=list('ABCD'))
df.columns = ['history_summary_number_1', 'history_summary_number_2', 'history_summary_number_3', 'history_summary_number_4']

pdf = FPDF()
pdf.add_page()
output_df_to_pdf(pdf, df)
pdf.output('test.pdf', 'F')

关键修改说明:

  • 适当调宽了列宽,保证长列名换行后不会过于拥挤,可根据实际业务的列名长度自行调整数值
  • 给multi_cell设置ln=0参数,关闭默认自动换行的特性
  • 手动控制光标坐标,保证所有表头在同一水平行排列,同时统计最高表头的高度,避免后续内容和表头重叠

内容的提问来源于stack exchange,提问作者Phoenix Islands

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:45:03