如何在未知数据位置的情况下从Excel导入的DataFrame中检索指定数据?
Excel非固定位置数据提取实现方案
核心逻辑:以固定的df.iloc[17,1](对应Excel工作表B18单元格,0基索引)作为定位锚点,所有位置可变的目标数据都基于该锚点的相对位置关系完成匹配提取。
可选实现方案
方案1:相对偏移直接定位(适用于目标与锚点有固定相对位置的场景)
提前确认目标数据和锚点的相对偏移量,直接通过行、列索引偏移取值即可:
- 目标在锚点右侧n列:行索引不变,列索引加n
- 目标在锚点下方n行:列索引不变,行索引加n
- 目标在锚点左上方:行、列索引对应减对应偏移量
示例代码:
from openpyxl import load_workbook import pandas as pd wb = load_workbook(strTotalFile, data_only=True) for sheet in wb.sheetnames: ws = wb[sheet] df = pd.DataFrame(ws.values) # 固定锚点 anchor = df.iloc[17,1] # 示例:取锚点右侧2列、下方3行的目标数据 target = df.iloc[17+3, 1+2]
方案2:锚点内容校验后提取(适用于多Sheet场景,过滤无效Sheet)
如果工作簿内存在无效空白Sheet或格式不匹配的Sheet,可以先校验锚点内容是否符合预期,再提取目标数据,避免无效取值:
wb = load_workbook(strTotalFile, data_only=True) valid_data = [] for sheet in wb.sheetnames: df = pd.DataFrame(wb[sheet].values) # 先校验锚点内容是否和预期一致 anchor_val = df.iloc[17,1] if anchor_val == "预设的锚点固定内容": # 校验通过后再按偏移取目标数据 sale_total = df.iloc[17, 4] # 锚点右侧3列为销售总额 profit = df.iloc[22, 1] # 锚点下方5行为净利润 valid_data.append({"sheet名称": sheet, "销售总额": sale_total, "净利润": profit})
方案3:动态匹配表头提取(适用于表头位置不固定、表头名称固定的场景)
如果目标数据归属的列位置可变,但表头名称固定,可以先扫锚点所在行找到目标表头的列索引,再提取对应列的目标数据:
df = pd.DataFrame(wb[sheet].values) # 以锚点所在的第17行作为表头参考行 ref_header = df.loc[17].tolist() # 查找名称为「实际回款」的表头对应的列索引 payback_col = ref_header.index("实际回款") # 提取该列第25行的回款数据 payback_val = df.iloc[25, payback_col]
注意事项
- 取值前可先判断索引是否越界,避免报错:
if 17+行偏移 < df.shape[0] and 1+列偏移 < df.shape[1] - 空单元格会被pandas识别为NaN,可提前用
df = df.fillna("")处理空值后再做内容校验
内容的提问来源于stack exchange,提问作者Joe Smith
相关产品推荐
相关产品推荐

