如何在FPDF中通过IF语句为表格值为No的单元格设置背景色?
解决FPDF表格中指定单元格添加背景色的问题
你的代码存在两个核心问题:
- 列名引用错误:列名包含空格时,不能用
df.Column B的方式引用,必须改用df['Column B']的索引形式。 - 逻辑判断错误:
df['Column B'].any() == "No"是判断整列是否存在至少一个"No",并非逐个单元格判断;而且你直接输出固定文本'No',没有结合DataFrame中的实际数据行进行遍历渲染。
正确实现思路
需要遍历DataFrame的每一行,针对Column B的每个单元格内容进行判断:
- 初始化PDF对象并设置基础样式(字体、页面等)。
- 绘制表格表头。
- 逐行遍历数据,对
Column B的值做判断:若为"No",则设置填充色后绘制单元格,绘制完成后重置填充色避免影响后续单元格;否则直接绘制默认样式的单元格。
完整示例代码
from fpdf import FPDF import pandas as pd # 初始化测试数据 df = pd.DataFrame({ 'Column A': ['Yes', 'Yes', 'No'], 'Column B': ['No', 'Yes', 'No'] }) # 创建PDF实例 pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) # 绘制表头 pdf.cell(30, 10, 'Column A', 1, 0, 'C') pdf.cell(30, 10, 'Column B', 1, 1, 'C') # 遍历数据行并绘制表格 for _, row in df.iterrows(): # 绘制Column A单元格 pdf.cell(30, 10, row['Column A'], 1, 0, 'C') # 处理Column B单元格的背景色逻辑 if row['Column B'] == 'No': pdf.set_fill_color(193, 229, 252) # 设置浅蓝填充色 # fill=True参数启用填充 pdf.cell(30, 10, row['Column B'], 1, 1, 'C', fill=True) pdf.set_fill_color(255, 255, 255) # 重置填充色为白色 else: pdf.cell(30, 10, row['Column B'], 1, 1, 'C') # 输出PDF文件 pdf.output("colored_table.pdf")
关键注意事项
- 列名含特殊字符(如空格)时,必须使用
df['列名']的索引方式访问。 - 绘制带填充色的单元格后,务必重置填充色为默认值(如白色),否则后续所有单元格都会沿用该填充色。
cell方法的最后一个参数fill必须设为True,才会应用设置的填充颜色。
内容的提问来源于stack exchange,提问作者Samson Shoyombo
相关产品推荐
相关产品推荐

