如何用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
相关产品推荐
相关产品推荐

