You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas读取Excel各工作表指定区域并将B14单元格设为索引的方法

优化实现方案

你可以根据需求选择以下两种实现路径,两种都能最终得到「每个工作表对应一个DataFrame,索引为该表B14单元格内容,数据为C19:N27区域」的结果:

方案1:单次读取(推荐,IO效率最高)

不需要分两次读取Excel,只需要一次性读取覆盖所有目标内容的最小矩形区域(B14:N27),再按位置拆分出标识符和目标数据即可,多工作表场景下能减少一半的文件解析开销,也不会出现两次读取sheet匹配错位的问题。

import pandas as pd

# 单次读取所有工作表的B列到N列、第14行到27行范围
raw_sheets = pd.read_excel(
    f,
    sheet_name=None,
    header=None,  # 关闭自动表头识别,按固定位置取值
    usecols="B:N",
    skiprows=13,  # 跳过前13行,第一行对应原表第14行
    nrows=14  # 一共读14行,覆盖到原表第27行
)

res = {}
for sheet_name, raw_df in raw_sheets.items():
    # 读取块的(0,0)位置就是原表B14的标识符
    b14_val = raw_df.iloc[0, 0]
    # 提取原表19-27行、C-N列对应的数据:读取块中第5行到第13行(19-14=5)、第1列到最后一列(第0列是B列,跳过)
    target_df = raw_df.iloc[5:14, 1:].reset_index(drop=True)
    # 将标识符设置为DataFrame的索引
    target_df.index = [b14_val] * len(target_df)
    res[sheet_name] = target_df

# 如果需要把所有工作表数据合并为一个大表,执行下面这行即可
# total_df = pd.concat(res.values())

方案2:兼容现有读取逻辑的拼接方案

如果你不想修改已有的两行读取代码,可以直接按工作表名匹配两次读取的结果,给每个DataFrame设置对应索引即可:

import pandas as pd

# 保留你原有的读取逻辑
data = pd.read_excel(f, sheet_name=None, index_col=None, usecols="C:N", skiprows=18, nrows=8)
identifier = pd.read_excel(f, sheet_name=None, index_col=None, header=None, usecols="B", skiprows=13)

res = {}
for sheet_name in data.keys():
    # 取当前工作表B14的值:identifier中对应表的第一行第一列即为目标值
    b14_val = identifier[sheet_name].iloc[0, 0]
    current_df = data[sheet_name].copy()
    # 为所有行设置索引为B14的标识符
    current_df.index = [b14_val] * len(current_df)
    res[sheet_name] = current_df

注意:pandas读取Excel时skiprows参数计数从0开始,对应Excel行号需要减1,取值时注意位置偏移不要写错。

内容的提问来源于stack exchange,提问作者anony1414

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 01:09:20