使用reportlab写入CSV数据到PDF失败:仅标题内容可正常写入
解决ReportLab写入CSV表格数据到PDF的问题
我完全懂这种卡壳的滋味——标题、日期这些静态信息都能正常输出,偏偏CSV里的表格数据就是不显示,着实让人头疼。咱们从最常见的问题入手,一步步排查修复:
一、先确认CSV数据是否被正确读取
很多时候问题根本不在ReportLab,而是CSV读取环节出了错。你可以先打印读取到的数据,确认是否拿到了完整的表格内容:
import csv # 先测试CSV读取是否正常 with open("data.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) data = list(reader) print("读取到的CSV数据:") print(data)
如果输出只有表头或者为空,那你需要检查:
- 文件路径是否正确(相对路径的话,确认脚本运行的工作目录)
- CSV文件的编码是否匹配(比如用
gbk还是utf-8) - CSV的格式是否规范(有没有多余的空行、分隔符是不是逗号)
二、检查ReportLab表格的生成与添加逻辑
ReportLab的表格需要正确的二维列表数据源,并且要把表格对象添加到文档的内容流里。如果用SimpleDocTemplate(推荐的流式文档方式),你需要把表格加入Story列表;如果用直接操作Canvas,则需要调用drawTable()方法。
完整的工作示例代码
下面是一个能正常生成带标题和CSV表格的完整脚本,你可以对照自己的代码找差异:
from reportlab.lib import colors from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph from reportlab.lib.styles import getSampleStyleSheet import csv # 1. 准备PDF文档模板 doc = SimpleDocTemplate("report.pdf", pagesize=letter) story = [] styles = getSampleStyleSheet() # 2. 添加标题信息 title = Paragraph("案件报告", styles["Title"]) date_line = Paragraph("报告日期:2024-05-20", styles["BodyText"]) case_num = Paragraph("案件编号:CASE-2024-001", styles["BodyText"]) story.extend([title, date_line, case_num, Paragraph("<br/>", styles["BodyText"])]) # 添加换行 # 3. 读取CSV数据 with open("data.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) table_data = list(reader) # 转成二维列表,表头+内容 # 4. 创建表格并设置样式 table = Table(table_data) # 设置表格样式(可选,让表格更美观) style = TableStyle([ ("BACKGROUND", (0,0), (-1,0), colors.grey), ("TEXTCOLOR", (0,0), (-1,0), colors.whitesmoke), ("ALIGN", (0,0), (-1,-1), "CENTER"), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("BOTTOMPADDING", (0,0), (-1,0), 12), ("BACKGROUND", (0,1), (-1,-1), colors.beige), ("GRID", (0,0), (-1,-1), 1, colors.black) ]) table.setStyle(style) # 5. 将表格添加到文档流 story.append(table) # 6. 生成PDF doc.build(story)
三、常见的坑要避开
- 表格尺寸问题:如果表格太宽超出页面,会被自动隐藏。可以手动设置列宽,比如
Table(table_data, colWidths=[100, 150, 80]) - 中文显示问题:如果CSV里有中文,需要加载中文字体,比如:
from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont pdfmetrics.registerFont(TTFont("SimSun", "SimSun.ttf")) # 然后在样式里指定字体:style.setFont("SimSun", 10) - 数据类型问题:CSV读取的内容都是字符串,如果有数字/日期,不需要额外转换,ReportLab能直接处理字符串
- 忘记添加表格到Story:这是最常见的错误——创建了Table对象,但没把它加入到
story列表里,自然不会显示在PDF中
你可以先按上面的步骤排查,先确认CSV读取正常,再对照示例代码检查表格的添加逻辑。如果还是有问题,可以把你的核心代码片段贴出来,咱们再针对性分析。
内容的提问来源于stack exchange,提问作者GreenCoder90
相关产品推荐
相关产品推荐

