如何使用openpyxl遍历Excel单元格内单个字符并筛选无删除线的字符?
如何使用openpyxl遍历Excel单元格内单个字符并筛选无删除线的字符?
嘿,我刚好碰到过类似的问题,来给你唠唠怎么解决!
你观察到的这个现象特别关键——单元格内容会被openpyxl解析成两种类型:普通字符串(str)或者富文本列表(rich_text)。普通字符串意味着整个单元格的格式是统一的,没有局部样式;而rich_text是由多个文本块组成的,每个块对应一段格式一致的内容,这就刚好对应你截图里“部分有删除线、部分没有”的情况。
给你一套具体的处理逻辑,连代码示例都给你写好了:
- 先判断单元格内容的类型
- 如果是普通
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
相关产品推荐
相关产品推荐

