Excel多行页眉需用skiprows跳过无关行再设header=0,避免MultiIndex导致索引错误;页脚用nrows限定读取行数或openpyxl探查有效数据范围;合并单元格页眉须用openpyxl解析合并区域并手动填充列名。

识别并跳过Excel中的多行页眉
Excel里常见第一行是标题、第二行是单位、第三行才是真正的列名——这种多层页眉会让 pd.read_excel() 直接读成错误的列名或空值。关键不是“怎么读”,而是“从哪一行开始读”。header 参数支持传入列表,比如 header=[0, 1, 2] 表示把前三行合并为 MultiIndex 列名;但更常用的是用 skiprows 跳过无关行,再用 header=0 指定实际列名所在行。
常见错误:只设 header=2,结果把单位行当列名,导致后续 df["销售额"] 报错 KeyError——因为真实列名可能是 ("销售额", "万元") 这种元组。
- 先用
pd.read_excel("data.xlsx", nrows=5)快速预览前几行,确认页眉占几行 - 若页眉共3行且第3行为真实列名,用
header=2(索引从0起) - 若页眉内容杂乱(如含空行、合并单元格),优先用
skiprows:例如跳过前4行再读,写成skiprows=4, header=0 - 读入后检查
df.columns类型:是Index还是MultiIndex?后者需用元组索引,如df[("销量", "件")]
处理底部页脚(合计行、说明文字等)
页脚通常出现在数据末尾,表现为“合计:xxx”“数据截至2024-03”等非结构化行。如果直接读取,这些行会混进 DataFrame 最后几行,类型错乱(数值列变成 object),聚合计算出错。
根本解法不是“删掉页脚”,而是“别读进来”。pd.read_excel() 的 nrows 参数能限定读取行数,配合 openpyxl 先探查真实数据行数最可靠。
立即学习“Python免费学习笔记(深入)”;
- 用
openpyxl.load_workbook()打开文件,获取工作表最大行:ws.max_row - 人工观察最后几行,确定有效数据截止行号(比如倒数第3行是“合计”,则有效数据到
max_row - 3) - 传给
pd.read_excel(..., nrows=effective_rows),避免加载页脚 - 如果页脚位置不固定,可在读入后用
df.tail(5).applymap(type).eq(str).all(axis=1)粗筛全为字符串的行,再df = df.iloc[:-n]截断
合并单元格页眉的兼容性坑
Excel 中合并单元格(如“销售部”横跨 A1:C1)被 pandas 读取时,只会给首列赋值,其余列为 NaN。这会导致 header=[0,1] 构建的 MultiIndex 出现大量 (nan, "Q1"),后续无法索引。
openpyxl 默认保留合并信息,但 pandas 不解析它。必须手动填充:用 openpyxl 读取原始单元格值 + 合并范围,再构造干净列名。
- 不要依赖
pd.read_excel(..., header=[0,1])处理合并页眉 - 改用
openpyxl.load_workbook(..., read_only=True)获取ws.merged_cells.ranges - 遍历首两行,对每个合并区域(如
"A1:C1"),用左上角值填充对应列名位置 - 把修复后的列名列表传给
pd.read_excel(..., header=None, skiprows=2),再df.columns = fixed_columns
为什么不用 xlrd 或其他引擎?
xlrd 从 2.0 版本起**不再支持 .xlsx 文件**,强行用会报 Unsupported format, or corrupt file。而 openpyxl 是目前唯一能可靠读取合并单元格、保持样式元数据的引擎,也是 pandas 官方推荐的 xlsx 后端。
如果你在 pd.read_excel() 里没指定 engine,pandas 会按扩展名自动选:.xls 用 xlrd(旧版),.xlsx 用 openpyxl(默认)。但显式声明更安全:
- 读 .xlsx 必须确保已安装
openpyxl:pip install openpyxl - 显式指定引擎:
pd.read_excel("data.xlsx", engine="openpyxl") - 若遇到
ValueError: Your version of openpyxl is too old,升级:pip install --upgrade openpyxl
多页眉/页脚的本质不是格式问题,而是“数据边界定义不清”。每次处理前花30秒看一眼 Excel 原文件的行号和合并状态,比调参一小时更有效。


















