OpenPyXL无法识别Excel黄色填充单元格问题求助
解决OpenPyXL无法识别黄色填充单元格的问题
核心问题分析
你的代码无法识别黄色单元格,主要有以下几个原因:
- 颜色格式不匹配:OpenPyXL中
cell.fill.start_color.rgb返回的是不带#的ARGB格式字符串(比如黄色对应的是FFFFFF00),而你用了#FFFF00(带#的RGB格式),导致匹配失败。同时需要先判断单元格是否有填充(fill_type不为none),否则空填充的start_color会返回默认值干扰判断。 - 变量赋值错误:你把单元格对象直接赋值给
start_row,后续执行start_row + 1会触发类型错误,应该取单元格的行号yellow_cell.row。 - 末尾黄色单元格查找逻辑错误:原代码遇到非黄色单元格就直接break,会漏掉后续连续的黄色行,应该遍历所有行直到找到最后一个黄色单元格。
修正后的代码
import openpyxl def sum_gr_values(file_name): # 加载工作簿 workbook = openpyxl.load_workbook(file_name) sheet = workbook.active # 定义黄色的ARGB值(OpenPyXL标准格式) YELLOW_ARGB = "FFFFFF00" # 查找第一个黄色填充单元格 yellow_cell = None for row in sheet.iter_rows(): for cell in row: # 先判断单元格有填充,再对比颜色 if cell.fill.fill_type != "none" and cell.fill.start_color.rgb == YELLOW_ARGB: yellow_cell = cell break if yellow_cell: break if not yellow_cell: print("未找到黄色填充单元格") workbook.save(file_name) return # 设置起始和结束行(存储行号,而非单元格对象) start_row = yellow_cell.row end_row = start_row # 查找最后一个同列的黄色填充单元格 target_column = yellow_cell.column for row in range(start_row + 1, sheet.max_row + 1): current_cell = sheet.cell(row=row, column=target_column) if current_cell.fill.fill_type != "none" and current_cell.fill.start_color.rgb == YELLOW_ARGB: end_row = row # 不中断遍历,持续更新最后一个黄色行号 # 统计F列为"GR"对应的E列数值之和 total_sum = 0 for row in range(start_row, end_row + 1): f_cell = sheet.cell(row=row, column=6) if f_cell.value == "GR": e_cell = sheet.cell(row=row, column=5) # 处理E列值为空的情况,避免报错 total_sum += e_cell.value if e_cell.value else 0 # 将结果写入第一个黄色单元格左侧的E列单元格 yellow_cell.offset(0, -1).value = total_sum # 保存修改 workbook.save(file_name) file_name = "file.xlsx" sum_gr_values(file_name)
关键修改说明
- 颜色匹配逻辑:使用OpenPyXL标准的ARGB颜色值,同时增加填充类型判断,排除无填充的单元格。
- 行号变量修正:将
start_row和end_row改为存储行号,避免类型错误。 - 末尾黄色单元格查找优化:遍历所有行,持续更新最后一个黄色单元格的行号,不会中途中断。
- 异常防护:增加未找到黄色单元格的判断,同时处理E列值为空的情况,防止运行时报错。
内容的提问来源于stack exchange,提问作者maradona
相关产品推荐
相关产品推荐

