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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:40:22