使用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
相关产品推荐
相关产品推荐

