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

如何使用openpyxl遍历Excel单元格内单个字符并筛选无删除线的字符?

如何使用openpyxl遍历Excel单元格内单个字符并筛选无删除线的字符?

嘿,我刚好碰到过类似的问题,来给你唠唠怎么解决!

你观察到的这个现象特别关键——单元格内容会被openpyxl解析成两种类型:普通字符串(str)或者富文本列表(rich_text)。普通字符串意味着整个单元格的格式是统一的,没有局部样式;而rich_text是由多个文本块组成的,每个块对应一段格式一致的内容,这就刚好对应你截图里“部分有删除线、部分没有”的情况。

给你一套具体的处理逻辑,连代码示例都给你写好了:

  1. 先判断单元格内容的类型
    • 如果是普通str:直接检查整个单元格的cell.font.strike属性——如果这个属性是False或者None(也就是没有删除线),就保留整个字符串;如果是True,就全部丢弃。
    • 如果是rich_text类型:遍历里面的每一个文本块,检查每个块的font.strike属性,只把没有删除线的文本块内容拼接起来。

下面是可直接用的代码:

from openpyxl import load_workbook
from openpyxl.cell.text import TextBlock

# 加载工作簿和工作表
wb = load_workbook("你的Excel文件.xlsx")
ws = wb.active

# 遍历单元格,这里你可以按需调整范围
for row in ws.iter_rows(min_row=1, max_row=20):  # 比如只遍历前20行
    for cell in row:
        filtered_content = ""
        # 处理富文本情况
        if isinstance(cell.value, list) and all(isinstance(block, TextBlock) for block in cell.value):
            for block in cell.value:
                # 仅保留无删除线的文本块内容
                if not block.font.strike:
                    filtered_content += block.text
        # 处理普通字符串情况
        elif isinstance(cell.value, str):
            # 普通字符串的格式由单元格整体字体决定
            if not cell.font.strike:
                filtered_content = cell.value
        # 处理空单元格或其他类型
        else:
            filtered_content = ""
        
        # 输出结果,你也可以把结果写回单元格或者做其他处理
        print(f"单元格{cell.coordinate}筛选后内容:{filtered_content}")

# 记得关闭工作簿
wb.close()

还要给你提两个注意点:

  • 为什么会出现“部分是str、部分是rich_text”的情况?这其实是openpyxl的解析逻辑:当单元格内只有一种统一格式时,会直接解析成str;一旦你给部分内容修改了样式(比如加删除线),Excel会把带样式的部分转成富文本存储,openpyxl就会解析为rich_text列表。
  • 检查strike属性时,默认值是None,所以用if not block.font.strike会把“无删除线”(包括未设置该属性的默认情况)都算进去,完全符合你的需求。

备注:内容来源于stack exchange,提问作者Yuuya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:59:34