如何用OpenPyxl判断Excel工作表中的行是否添加了删除线?
解决OpenPyxl读取行删除线属性的问题
首先明确两个核心问题:
- OpenPyxl的
row_dimensions仅存储被手动修改过样式的行(比如改了行高、自定义字体),默认样式或继承来的行样式不会生成条目,这就是你找不到带删除线行条目的原因。 - 单元格显示删除线但
cell.strike为False,是因为删除线是从行样式继承来的,直接访问cell.font只会返回单元格自身的样式,不会自动继承行/列的样式。
解决方案1:获取单元格的有效字体样式(继承行/列/默认样式)
写一个函数来按优先级获取单元格最终显示的字体样式,覆盖单元格自身、行、列、工作簿默认样式的层级:
from openpyxl.styles import Font def get_effective_font(cell): # 优先级:单元格自身 > 行样式 > 列样式 > 工作簿默认 if cell.font != Font(): return cell.font row_dim = cell.parent.row_dimensions[cell.row] if row_dim.font != Font(): return row_dim.font col_dim = cell.parent.column_dimensions[cell.column_letter] if col_dim.font != Font(): return col_dim.font return cell.parent.parent.default_style.font
然后用这个函数检查行的删除线:
sheet = book[sheet_name] for row in sheet.iter_rows(min_row=1, max_row=sheet.max_row): first_cell = row[0] effective_font = get_effective_font(first_cell) if effective_font.strike: # 找到带删除线的行 break
解决方案2:检查条件格式(如果删除线是通过条件格式设置的)
如果删除线是Excel条件格式生成的,上面的方法不生效,需要直接遍历条件格式规则:
for rule in sheet.conditional_formatting.rules: if hasattr(rule, 'font') and rule.font.strike: # 遍历规则应用的所有行 for rng in rule.cells.ranges: for row_num in range(rng.min_row, rng.max_row + 1): print(f"行 {row_num} 通过条件格式设置了删除线")
补充说明
- OpenPyxl对Excel样式的读取有局限性,尤其是继承样式和条件格式,需要结合实际场景选择方法。
- 如果行的删除线是通过Excel的“开始”选项卡直接整行设置的,解决方案1应该能生效;如果是批量套用样式或条件格式,需要用解决方案2。
内容的提问来源于stack exchange,提问作者Quicky
相关产品推荐
相关产品推荐

