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

如何用Python从多个Excel文件中提取红色高亮行数据

问题分析与解决方法

代码核心问题

  • PatternFill对象直接比较无效:每次调用PatternFill(...)都会生成新的内存对象,用==永远无法匹配,得检查填充的具体属性。
  • 空值未处理:若O列或D列单元格为空,字符串拼接会触发TypeError。
  • 文件操作不严谨:手动open后靠close()收尾,代码中途报错会导致文件未正常关闭。
  • 未读取单元格实际值:openpyxl默认data_only=False,会读取公式而非计算后的结果,需显式设置参数。

修复后的代码

import pathlib
import openpyxl

# 定义目标红色填充的属性
TARGET_FILL = {
    'patternType': 'solid',
    'fgColor': 'ff0000'
}

# 用上下文管理器自动处理文件开闭
with open('dataresult.txt', 'w', encoding='utf-8') as f:
    path = pathlib.Path(r"..\data")
    for path_obj in path.glob("*.xlsx"):
        # 加载工作簿时读取单元格实际值
        wb = openpyxl.load_workbook(path_obj, data_only=True)
        for sheetname in wb.sheetnames:
            sheet = wb[sheetname]
            # 从第2行开始遍历行(假设第1行是表头)
            for row in sheet.iter_rows(min_row=2, values_only=False):
                cell_a_fill = row[0].fill
                # 校验填充样式是否匹配目标红色
                if (cell_a_fill.patternType == TARGET_FILL['patternType'] 
                    and cell_a_fill.fgColor.rgb == TARGET_FILL['fgColor']):
                    # 处理空值,避免拼接报错
                    col_o_val = row[14].value if row[14].value is not None else ''
                    col_d_val = row[3].value if row[3].value is not None else ''
                    f.write(f"{col_o_val},{col_d_val}\n")

优化说明

  • 样式匹配逻辑:通过对比填充对象的patternType和fgColor.rgb属性,精准判断红色高亮行。
  • 空值兼容:用三元表达式将空单元格转为空字符串,避免类型错误。
  • 上下文管理器:with open(...)自动管理文件生命周期,无需手动调用close()。
  • 行遍历优化:使用iter_rows更简洁地遍历行,通过索引定位列(A是0,D是3,O是14)。
  • 编码设置:指定encoding='utf-8',避免中文写入时乱码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:36:21