使用xlwings定位Excel指定文本并设置格式报错求助
问题解决:批量处理Excel文件,高亮指定文本并另存
需求
- 批量处理多个含12个工作表的Excel文件
- 找到所有出现的文本
Project has been blocked,设置为红色加粗格式 - 将处理后的文件另存为
.xlsx格式
现有代码问题分析
第一段代码问题
- 错误操作整列格式:
ws[col].characters会修改整列的字符格式,而非目标单元格内的指定文本 - 仅处理单元格值完全等于目标文本的情况,忽略了文本是单元格内容一部分的场景
第二段代码问题
- 未导入Excel常量(如
xlValues、xlByColumns),触发COM调用错误 - 函数
find_next_cell定义在workbook初始化之前,ws变量未提前赋值,存在作用域问题 - 循环逻辑未处理
update_cell为None的情况,导致后续访问_inner.Address报错 - 格式设置与需求不符(设置为绿色非加粗,而非红色加粗)
正确实现代码
import os import glob import xlwings as xw from xlwings.constants import LookIn, SearchOrder, SearchDirection # 目标文本 REQ_TEXT = "Project has been blocked" # 源文件路径和输出路径 SOURCE_DIR = os.path.join(os.getcwd(), "sheet_replaced_files") OUTPUT_DIR = os.path.join(os.getcwd(), "colored_text") # 创建输出目录 os.makedirs(OUTPUT_DIR, exist_ok=True) # 获取所有目标Excel文件 files = glob.glob(os.path.join(SOURCE_DIR, "YR2022_*.xlsx")) for file_path in files: # 获取文件名 filename = os.path.basename(file_path) print(f"处理文件: {filename}") with xw.App(visible=False, display_alerts=False) as app: wb = xw.Book(file_path) # 遍历所有工作表(处理12个工作表) for ws in wb.sheets: used_range = ws.used_range if used_range is None: continue # 跳过空工作表 # 遍历每个单元格 for cell in used_range: cell_value = cell.value if not isinstance(cell_value, str): continue # 跳过非文本内容 # 找到所有目标文本的起始位置 start_idx = 0 while True: start_pos = cell_value.find(REQ_TEXT, start_idx) if start_pos == -1: break # 设置指定范围的文本格式:红色加粗 cell.characters[start_pos:start_pos+len(REQ_TEXT)].font.bold = True cell.characters[start_pos:start_pos+len(REQ_TEXT)].font.color = (255, 0, 0) # 更新起始索引,避免重复匹配 start_idx = start_pos + len(REQ_TEXT) # 另存为xlsx格式 save_path = os.path.join(OUTPUT_DIR, filename) wb.save(save_path) wb.close() print("所有文件处理完成")
代码说明
- 导入
xlwings.constants中的枚举常量,避免COM错误 - 遍历所有工作表,确保处理全部12个工作表
- 逐个单元格检查,处理文本内容中包含目标文本的情况(包括部分匹配)
- 正确定位目标文本的起止位置,仅修改对应范围的格式
- 创建输出目录确保保存路径有效,批量处理后自动关闭工作簿
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

