最稳方法是用 pandas.read_excel 配合 iloc 定位,如 header=none 后用 .iloc[1, 1] 取 b2;批量处理用 glob + os.path.join 构建路径并校验文件存在性;结果统一收集后写入,避免覆盖。

用 pandas.read_excel 读取单个 Excel 的指定单元格最稳
直接靠 openpyxl 或 xlrd 定位 A1、C5 这类坐标容易出错——尤其当表格有合并单元格、空行或格式不统一时。pandas.read_excel 虽然默认读整表,但配合 usecols 和 skiprows 参数,能更鲁棒地“瞄准”目标区域。
实操建议:
- 如果目标单元格是固定位置(比如每张表的
B2),先用header=None读全表,再用.iloc[1, 1](注意行列从 0 开始)取值,比硬解析坐标可靠 - 如果目标是某列标题下的首条数据(如“销售额”列第一行数值),用
df["销售额"].iloc[0]更语义化,也避开空标题/多级表头问题 - 别用
sheet_name=0硬编码工作表序号——改名或顺序变动就崩;优先用sheet_name="汇总"显式指定名字
批量处理多个文件:用 glob + os.path.join 构建路径最安全
写死路径(如 "C:\data\file1.xlsx")在不同机器上大概率报 FileNotFoundError;用相对路径又容易因工作目录变化失效。
实操建议:
- 用
import glob配合通配符:glob.glob("./input/*.xlsx"),自动收集成批文件列表 - 拼路径必须用
os.path.join("input", filename),别手写"input/" + filename—— Windows 用反斜杠,Linux/macOS 用正斜杠,不统一就报错 - 加一层
if os.path.isfile(path)判断,跳过隐藏文件或临时锁文件(如~$report.xlsx)
提取结果存成新 Excel:别用 to_excel 循环覆盖
常见错误是每读一个文件就调一次 df.to_excel("output.xlsx"),结果只有最后一个文件的数据——因为默认覆盖写入。
实操建议:
- 把每次提取的值存在列表里,比如
results.append({"文件名": name, "B2值": value}),最后统一转pd.DataFrame(results) - 要保留原始文件名作为标识,用
os.path.basename(path)提取,别用path.split("/")[-1]—— 在 Windows 上会切错 - 写入时加
index=False,否则多一列无意义的行号
遇到 xlrd.biffh.XLRDError: Excel xlsx file; not supported 怎么办
这是老版本 xlrd(.xls,不认 .xlsx。很多人 pip install 时没注意版本,或者环境里混了旧包。
实操建议:
- 直接卸载:
pip uninstall xlrd,pandas 1.2+ 已默认用openpyxl或xlrd读.xlsx,不需要手动装xlrd - 如果必须用
xlrd(比如要读旧.xls),就限定版本:pip install "xlrd,但注意它仍不支持 <code>.xlsx - 检查实际读取引擎:
pandas.read_excel(..., engine="openpyxl")显式指定,避免 pandas 自动选错
真正麻烦的不是语法,而是每个 Excel 文件的实际结构差异——有的 B2 是数字,有的是字符串带空格,有的单元格看着有值其实是公式结果为空。建议第一次跑前,先对 2–3 个样本文件单独 print 出 raw 值,确认类型和清洗逻辑,再批量执行。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











