You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python根据Excel单元格值填充对应行背景色

Excel重复行标记高亮实现问题排查

现有操作流程

  1. 初始有一份Excel列表文件,内容如下:
    初始Excel列表截图
  2. 已通过Python+pandas+openpyxl实现重复记录查找逻辑:判断Country、Name两列同时重复的行,将判断结果写入D列(Duplicate列),已验证可正常运行的代码如下:
    import openpyxl as xl
    import pandas as pd
    
    df = pd.read_excel('C:/Users/User/Desktop/List.xlsx')
    df['Duplicate'] = df.duplicated(['Country', 'Name'], keep=False)
    up_col_d = df['Duplicate']
    
    wb = xl.load_workbook('C:\\Users\\User\\Desktop\\List.xlsx')
    ws = wb.active
    
    for df_row, df_value in enumerate(up_col_d, start=2):
        ws[f'D{df_row}'].value = df_value
    
    wb.save('C:\\Users\\User\\Desktop\\List.xlsx')
    
  3. 上述代码运行后,D列已正确写入TRUE/FALSE的重复标记,效果如下:
    重复标记写入后的Excel效果
  4. 预期实现效果:D列值为TRUE时,对应整行填充为黄色。编写的如下代码运行后完全无效果,需要排查问题:
    import openpyxl as xl
    from openpyxl import Workbook
    from openpyxl.styles import Color, PatternFill, Font, Border
    from openpyxl.formatting.rule import Rule
    from openpyxl.styles.differential import DifferentialStyle 
    
    def background_colors(path):
        wb = xl.load_workbook('C:\\Users\\User\\Desktop\\List.xlsx')
        ws = wb.active
        yellow = "00FFFF00"
        for rows in sheet.iter_rows(min_row=1, max_row=1, min_col=1, max_col=3):
             for cell in rows:
                 if cell == 'TRUE':
                     cell.fill = PatternFill(start_color=yellow, end_color=yellow,
                                             fill_type="solid")
         workbook.save(path)
     if __name__ == "__main__":
     background_colors('C:\\Users\\User\\Desktop\\List.xlsx')
    

代码存在的核心问题

  • 变量引用错误:加载工作表后赋值的变量名是ws,循环遍历时错写为sheet;加载的工作簿变量名是wb,保存时错写为workbook,运行时会直接抛出变量未定义的报错。
  • 遍历范围完全错误:iter_rows设置max_row=1,只会遍历第1行的表头;max_col=3只会遍历到C列,完全跳过了存储TRUE/FALSE判断值的D列,根本读不到判断条件对应的单元格。
  • 判断逻辑错误:循环拿到的cell是单元格对象,不是单元格的值,直接和字符串'TRUE'比对永远不会成立;且openpyxl读取布尔类型的单元格值时,返回的是Python原生布尔值True,不是字符串类型。
  • 需求匹配错误:当前逻辑是给值为TRUE的单个单元格填色,没有实现「D列为TRUE时整行填色」的需求,没有遍历整行单元格设置格式。
  • 缩进语法错误:函数内部代码、if __name__块内的代码缩进不规范,Python解释器会直接抛出缩进错误。
  • 冗余导入:导入了Workbook、Font、Border、Rule、DifferentialStyle等完全未使用的模块,不影响运行但属于无效代码。

修正后可直接运行的代码

逐行遍历实现

import openpyxl as xl
from openpyxl.styles import PatternFill

def background_colors(path):
    wb = xl.load_workbook(path)
    ws = wb.active
    yellow_fill = PatternFill(start_color="00FFFF00", end_color="00FFFF00", fill_type="solid")
    # 从第2行开始遍历(跳过表头),覆盖所有有数据的行和列
    for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=1, max_col=ws.max_column):
        # D列是每行第4个元素(索引从0开始为3),判断值是否为布尔True
        if row[3].value is True:
            # 给当前行所有单元格设置黄色填充
            for cell in row:
                cell.fill = yellow_fill
    wb.save(path)

if __name__ == "__main__":
    background_colors('C:\\Users\\User\\Desktop\\List.xlsx')

条件格式实现(运行效率更高)

import openpyxl as xl
from openpyxl.styles import PatternFill
from openpyxl.formatting.rule import FormulaRule

def background_colors(path):
    wb = xl.load_workbook(path)
    ws = wb.active
    yellow_fill = PatternFill(start_color="00FFFF00", end_color="00FFFF00", fill_type="solid")
    # 对数据区域设置条件格式:D列值为TRUE时整行填黄
    range_str = f"A2:D{ws.max_row}"
    rule = FormulaRule(formula=['$D2=TRUE'], fill=yellow_fill)
    ws.conditional_formatting.add(range_str, rule)
    wb.save(path)

if __name__ == "__main__":
    background_colors('C:\\Users\\User\\Desktop\\List.xlsx')

内容的提问来源于stack exchange,提问作者CHL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:03:24