Python Excel条件格式自动高亮达标行实战
用openpyxl的CellIsRule和FormulaRule给Excel加条件格式:分数大于等于90整行变绿、低于60整行标红、分数列三色渐变,无需手动点格式刷。
场景痛点
每次导出成绩表、销售表,都要手动把"及格的标绿、不及格的标红、超额完成的整行飘红"。数据量一小还好,几百上千行靠肉眼挑、格式刷拖,又慢又容易漏。而且下个月数据一更新,之前设的格式对不上新数据,又得重来。用Python把高亮规则写进文件,每次跑脚本自动出结果,规则固定不会漏。
用到的库
pip install openpyxl
完整代码
# -*- coding: utf-8 -*-
"""
openpyxl 给 Excel 加条件格式:
1) 分数 >= 90 绿色填充
2) 分数 < 60 红色填充
3) 整行按是否达标高亮
4) 分数列三色色阶
"""
from openpyxl import Workbook
from openpyxl.styles import PatternFill, Font
from openpyxl.formatting.rule import CellIsRule, FormulaRule, ColorScaleRule
def build_sheet(path: str):
wb = Workbook()
ws = wb.active
ws.title = "成绩表"
headers = ["姓名", "语文", "数学", "总分"]
ws.append(headers)
data = [
["张三", 92, 95],
["李四", 58, 61],
["王五", 88, 90],
["赵六", 45, 52],
["钱七", 76, 80],
["孙八", 99, 100],
]
for row in data:
total = row[1] + row[2]
ws.append(row + [total])
# ========== 规则1:语文/数学 >= 90 绿色 ==========
green_fill = PatternFill(start_color="C6EFCE", end_color="C6EFCE",
fill_type="solid")
green_font = Font(color="006100")
ws.conditional_formatting.add(
"B2:C7",
CellIsRule(operator="greaterThanOrEqual",
formula=["90"],
fill=green_fill, font=green_font)
)
# ========== 规则2:分数 < 60 红色 ==========
red_fill = PatternFill(start_color="FFC7CE", end_color="FFC7CE",
fill_type="solid")
red_font = Font(color="9C0006")
ws.conditional_formatting.add(
"B2:C7",
CellIsRule(operator="lessThan",
formula=["60"],
fill=red_fill, font=red_font)
)
# ========== 规则3:总分 >= 180 整行(A~D)黄色高亮 ==========
yellow_fill = PatternFill(start_color="FFEB9C", end_color="FFEB9C",
fill_type="solid")
# 公式规则:以每行第一个判定单元格($D2)为基准,整行 A$2:D$7
ws.conditional_formatting.add(
"A2:D7",
FormulaRule(formula=["$D2>=180"], fill=yellow_fill)
)
# ========== 规则4:总分列三色渐变(红-黄-绿) ==========
color_scale = ColorScaleRule(
start_type="min", start_color="F8696B",
mid_type="percentile", mid_value=50, mid_color="FFEB84",
end_type="max", end_color="63BE7B",
)
ws.conditional_formatting.add("D2:D7", color_scale)
wb.save(path)
print("已生成:", path)
def main():
build_sheet("score_conditional.xlsx")
if __name__ == "__main__":
main()
代码讲解
CellIsRule用来做"单元格值比较"类规则:operator取greaterThanOrEqual、lessThan、equal等,formula传阈值。它对选区B2:C7里每个单元格单独判断,本例把>=90的涂绿、<60的涂红,正好对应成绩表的"优秀/不及格"。FormulaRule用来做"整行联动":选区是A2:D7(整行范围),但判断公式只写$D2>=180。这里的关键是$D列锁定、行号2不锁。Excel 应用规则到第 3 行时会自动变成$D3>=180,于是"总分达标就整行变黄"成立。ColorScaleRule做色阶:最小值红、中位数黄、最大值绿,一列数据一眼看出高低分布,比纯色填充更适合看趋势。PatternFill必须给fill_type="solid",否则填充不生效;start_color用 ARGB/RGB 十六进制。- 多条规则叠在同一区域时,按添加顺序优先;本例规则1/2只作用于单科,规则3作用整行,互不冲突。
运行结果
生成 score_conditional.xlsx。打开后:B、C 列里 90 分以上的单元格绿底深绿字,60 分以下的红底深红字;D 列总分从低到高自动红黄绿渐变;同时总分>=180 的那几行 A~D 整行变黄底。改任意分数,颜色会实时跟着变。
注意事项
operator的可选值固定为between、notBetween、equal、notEqual、greaterThan、lessThan、greaterThanOrEqual、lessThanOrEqual,写错会报错。FormulaRule里引用单元格时,美元符号$一定要想清楚:列锁行不锁才能整行联动;整列锁定则只能做固定列判断。- openpyxl 写的条件格式是"规则定义",打开 Excel/WPS 时由软件实时渲染颜色。openpyxl 自己读取时读不出算出来的颜色,别指望用它回读高亮状态。
- 中文字体、字体大小不影响规则,但
Font(color=...)传十六进制字符串,不要传颜色中文名。 - 条件格式规则只在文件被 Excel 类软件打开时生效;用 pandas 重新读回数据时颜色信息会丢失,这是正常的。

更新时间:2026-09-15 09:12:24
上一篇:Python Excel 统计人数频次生成分类汇总方法