如何在指定目录的Excel电子表格中检索B列指定字符串并返回匹配文件名
原代码的适配缺陷
- 现有逻辑是将所有文件作为纯文本二进制流逐行读取,无法识别Excel的结构化二进制存储格式,既可能把文件元数据里的乱码字符误判为匹配内容,也完全没法精准定位到表格B列的有效内容
- 原逻辑没有做文件后缀过滤,会遍历目录下所有类型的文件(包括图片、压缩包、可执行程序等),产生大量无意义的读取操作,效率极低
可直接落地的改造代码
首先需要提前安装依赖库,执行命令:pip install openpyxl
完整可运行代码:
import os import openpyxl keyword = input("请输入需要检索的关键词:") # 替换为你实际要检索的根目录路径 root_dir = "替换为你的待检索根目录路径" # 存储匹配到结果的文件列表 matched_files = [] for root, dirs, files in os.walk(root_dir, onerror=None): for filename in files: # 只处理xlsx格式的Excel文件,过滤其他无意义的文件类型 if not filename.lower().endswith(".xlsx"): continue file_path = os.path.join(root, filename) try: # 以只读模式加载Excel,读取单元格实际存储值(跳过公式),减少内存占用 wb = openpyxl.load_workbook(file_path, read_only=True, data_only=True) # 遍历当前文件下所有工作表 for ws in wb.worksheets: # 只读取B列的所有单元格内容,不遍历其他列提升效率 for cell in ws["B"]: cell_val = cell.value # 跳过空单元格,匹配目标关键词 if cell_val and keyword in str(cell_val): matched_files.append(filename) # 匹配成功后关闭工作簿,跳出循环,无需继续读取剩余内容 wb.close() break # 已经匹配到当前文件,直接跳出工作表循环 if filename in matched_files: break wb.close() except (IOError, OSError, Exception): # 跳过权限不足、文件损坏的异常情况,避免程序中断 continue # 输出最终检索结果 if matched_files: print("检索完成,匹配到的文件如下:") for file in set(matched_files): print(f"- {file}") else: print("未检索到包含目标关键词的Excel文件")
使用注意事项
- 替换
root_dir为你实际存放Excel文件的根目录路径,*Windows系统填写路径时建议在字符串前加r,比如r"C:\公司文件\报表目录",避免路径里的反斜杠被识别为转义字符导致报错 - 代码全程以*只读模式读取文件,不会修改原Excel的任何内容,配合
read_only=True参数,即使是带大量数据的大体积Excel文件,也不会占用过高内存 - 如果需要输出文件的完整存储路径,把代码里
matched_files.append(filename)改成matched_files.append(file_path)即可 - 如果需要兼容2007年之前的老版本.xls格式文件,需要安装1.2.0版本的xlrd库(可通过
pip install xlrd==1.2.0安装),调整代码里的文件后缀判断和对应读取逻辑即可,新版本xlrd已经不再支持读取xls格式
内容的提问来源于stack exchange,提问作者Ausamah Hobbi
相关产品推荐
相关产品推荐

