如何通过XML提取Excel中黄色高亮对应的条件格式规则?
提取Excel中黄色高亮的条件格式单元格列表
一、改进OpenPyXL实现方案
OpenPyXL并非无法筛选黄色高亮规则,只是需要深入解析条件格式的规则细节,检查填充色的RGB值。以下是可直接使用的代码:
from openpyxl import load_workbook def get_yellow_highlighted_cf(filename, sheet_name="Sheet1"): wb = load_workbook(filename) ws = wb[sheet_name] yellow_cf_results = [] # 覆盖Excel中常见的黄色高亮HEX值,可根据实际需求调整 target_yellow_hex = {"FFFF00", "FFF2CC", "FFEB9C", "FFD966"} for cf in ws.conditional_formatting: # 遍历每个条件格式下的规则 for rule in cf.cfRule: # 检查规则是否包含填充格式 if hasattr(rule, "fill") and rule.fill: fill_pattern = rule.fill.patternFill if fill_pattern and fill_pattern.fgColor and fill_pattern.fgColor.rgb: color_hex = fill_pattern.fgColor.rgb.upper() if color_hex in target_yellow_hex: # 提取规则条件(公式) condition = rule.formula[0] if rule.formula else "无明确触发条件" yellow_cf_results.append( f"条件格式 {cf.cells},触发条件:{condition},黄色HEX值:{color_hex}" ) return yellow_cf_results # 调用示例 yellow_cf_list = get_yellow_highlighted_cf("你的Excel文件.xlsx") for item in yellow_cf_list: print(item)
该代码会遍历工作表所有条件格式规则,检查填充前景色是否匹配目标黄色集合,最终返回符合要求的区域、触发条件及对应色值。
二、直接解析Excel XML文件
XLSX本质是压缩包,内部xl/worksheets/[工作表名].xml存储了工作表的条件格式数据,xl/styles.xml存储样式定义。直接解析XML速度更快,无需依赖Excel客户端。
解析代码示例
import zipfile import xml.etree.ElementTree as ET def parse_yellow_cf_via_xml(filename, sheet_name="sheet1"): yellow_cf_results = [] target_yellow_hex = {"FFFF00", "FFF2CC", "FFEB9C", "FFD966"} # Excel XML默认命名空间 ns = {"default": "http://schemas.openxmlformats.org/spreadsheetml/2006/main"} with zipfile.ZipFile(filename, "r") as zf: # 1. 读取样式XML,预存所有差异格式(DXF)的填充色 style_tree = ET.fromstring(zf.read("xl/styles.xml").decode("utf-8")) dxf_color_map = {} for idx, dxf in enumerate(style_tree.findall(".//default:dxfs/default:dxf", ns)): fill = dxf.find("default:fill", ns) if fill: fg_color = fill.find("default:patternFill/default:fgColor", ns) if fg_color and "rgb" in fg_color.attrib: dxf_color_map[idx] = fg_color.attrib["rgb"].upper() # 2. 读取工作表XML,筛选黄色条件格式 sheet_tree = ET.fromstring(zf.read(f"xl/worksheets/{sheet_name}.xml").decode("utf-8")) for cf in sheet_tree.findall(".//default:conditionalFormatting", ns): cell_range = cf.find("default:sqref", ns).text for rule in cf.findall("default:cfRule", ns): # 处理引用DXF样式的规则 dxf_id = rule.get("dxfId") if dxf_id and int(dxf_id) in dxf_color_map: color_hex = dxf_color_map[int(dxf_id)] if color_hex in target_yellow_hex: formula = rule.find("default:formula", ns).text if rule.find("default:formula", ns) else "无明确触发条件" yellow_cf_results.append( f"条件格式 {cell_range},触发条件:{formula},黄色HEX值:{color_hex}" ) # 处理直接定义填充的规则 fill = rule.find("default:fill", ns) if fill: fg_color = fill.find("default:patternFill/default:fgColor", ns) if fg_color and "rgb" in fg_color.attrib: color_hex = fg_color.attrib["rgb"].upper() if color_hex in target_yellow_hex: formula = rule.find("default:formula", ns).text if rule.find("default:formula", ns) else "无明确触发条件" yellow_cf_results.append( f"条件格式 {cell_range},触发条件:{formula},黄色HEX值:{color_hex}" ) return yellow_cf_results # 调用示例 xml_result = parse_yellow_cf_via_xml("你的Excel文件.xlsx") for item in xml_result: print(item)
该方法直接读取压缩包内的XML文件,跳过了Excel客户端交互,速度远快于PyWin32和Xlwings,适合批量处理大量文件。
内容的提问来源于stack exchange,提问作者Hooded 0ne
相关产品推荐
相关产品推荐

