如何用Python根据Excel单元格值填充对应行背景色
Excel重复行标记高亮实现问题排查
现有操作流程
- 初始有一份Excel列表文件,内容如下:

- 已通过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') - 上述代码运行后,D列已正确写入
TRUE/FALSE的重复标记,效果如下:
- 预期实现效果: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
相关产品推荐
相关产品推荐

