Python Excel设置单元格背景色:PatternFill高亮条件行
用openpyxl的PatternFill给单元格填充背景色,按条件高亮整行、表头、金额异常行,避免手动涂颜色,附完整代码。
场景痛点
报表里要把超过阈值的行标黄、表头涂深蓝、周末日期涂灰,肉眼一行行找再涂色,几十行还行,几千行就疯了。用 openpyxl 的 PatternFill,把判断条件写成 Python 表达式,扫一遍表自动上色,结果一致、不会漏。
用到的库
pip install openpyxl
完整代码
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
def highlight_rows(file_path: str) -> None:
wb = load_workbook(file_path)
ws = wb.active
# 1) 定义三种填充色,fill_type 必须写 "solid" 才是纯色填充
header_fill = PatternFill(start_color="FF1F4E78", # 深蓝
end_color="FF1F4E78",
fill_type="solid")
warn_fill = PatternFill(start_color="FFFFF2CC", # 浅黄
end_color="FFFFF2CC",
fill_type="solid")
bad_fill = PatternFill(start_color="FFF8CBAD", # 浅红
end_color="FFF8CBAD",
fill_type="solid")
# 2) 表头整行涂色
for cell in ws[1]:
if cell.value is not None:
cell.fill = header_fill
# 3) 找"金额"列和"状态"列的位置
header = [c.value for c in ws[1]]
amount_col = header.index("金额") + 1 if "金额" in header else None
status_col = header.index("状态") + 1 if "状态" in header else None
# 4) 从第 2 行开始按条件涂色
for row in range(2, ws.max_row + 1):
# 金额 > 5000 整行涂浅黄
if amount_col:
value = ws.cell(row=row, column=amount_col).value
if isinstance(value, (int, float)) and value > 5000:
for col in range(1, ws.max_column + 1):
ws.cell(row=row, column=col).fill = warn_fill
# 状态为"异常"整行涂浅红(覆盖上面的黄色)
if status_col:
status = ws.cell(row=row, column=status_col).value
if status == "异常":
for col in range(1, ws.max_column + 1):
ws.cell(row=row, column=col).fill = bad_fill
wb.save(file_path)
print("背景色已应用并保存")
if __name__ == "__main__":
highlight_rows(r"D:\reports\销售明细.xlsx")
代码讲解
PatternFill(start_color=..., end_color=..., fill_type="solid")用来设置填充;fill_type一定要写"solid",留空或None就是无填充,颜色不会显示。start_color和end_color纯色填充时填同一个 ARGB 值即可,8 位串前两位是透明度。- 表头那段遍历第 1 行,把有内容的格子涂深蓝。
- 按列名找列号,避免写死列位置;找不到就置
None,后续if跳过,脚本不崩。 - 金额大于 5000 的行整行涂浅黄;状态为「异常」的行再涂浅红,后写的覆盖先写的,实现优先级。
- 涂整行时循环
range(1, ws.max_column + 1),把 A 到最后一列都设上fill。
运行结果
打开文件,第 1 行表头是深蓝底;金额超过 5000 的数据行是浅黄底;状态列写着「异常」的行是浅红底。保存后格式保留。
注意事项
- 忘记
fill_type="solid"是最常见的坑,看起来代码写了颜色但打开 Excel 没反应。 - 颜色是 ARGB 8 位,前两位
FF表示不透明;只写 6 位 RGB 也能识别,但建议写全。 - 涂整行会覆盖掉原来已有的填充色,业务上如果只想涂某一列,把内层循环改成只遍历那几列即可。
PatternFill也支持图案填充(如gray125),但报表里 99% 场景用solid。- 和字体一样,样式对象要整体替换,不能
cell.fill.start_color = "..."这么改。

更新时间:2026-09-15 09:12:54
上一篇:Python Excel批量修改单元格字体:字号颜色加粗一键设置