
本文介绍一种两阶段策略,用于精准识别并提取excel文件中未定义为正式表格、但以标题(如“ruletable”)标识的多个伪表格区域,避免读取空白行/列,提升数据清洗效率。
本文介绍一种两阶段策略,用于精准识别并提取excel文件中未定义为正式表格、但以标题(如“ruletable”)标识的多个伪表格区域,避免读取空白行/列,提升数据清洗效率。
在实际业务场景中,许多Excel报表虽逻辑上划分为多个表格,却未使用Excel的“插入表格”(Ctrl+T)功能,而是通过标题文字(如 RuleTable_01)、空行/空列或格式分隔——这类“伪表格”无法被 pandas.read_excel() 直接按表解析,导致加载后充斥大量 NaN,且表间边界模糊。
针对该问题,推荐采用双遍历法(Two-Pass Approach):
- 第一遍扫描:定位所有表格起始单元格坐标(基于标题关键词);
- 第二遍提取:以每个起始点为锚点,向右向下扩展读取,遇首个空单元格即截断,构建独立子表。
以下为完整可运行实现(适配 pandas>=2.0):
import pandas as pd
import numpy as np
def extract_pseudo_tables(file_path: str, sheet_name: str = 0, table_keyword: str = "RuleTable") -> list[pd.DataFrame]:
"""
从Excel中提取以指定关键词开头的连续非空数据块(伪表格)
Parameters:
-----------
file_path : str
Excel文件路径
sheet_name : str or int
工作表名或索引
table_keyword : str
表格标题的识别关键词(支持startswith匹配)
Returns:
--------
List of DataFrames, each representing one extracted pseudo-table.
"""
# 第一遍:读取全量数据并定位所有表格起始位置(行索引、列索引)
df_raw = pd.read_excel(file_path, sheet_name=sheet_name, header=None)
table_starts = []
for row_idx in range(len(df_raw)):
for col_idx in range(len(df_raw.columns)):
cell_val = df_raw.iloc[row_idx, col_idx]
if pd.notna(cell_val) and str(cell_val).startswith(table_keyword):
table_starts.append((row_idx, col_idx))
break # 每行仅取首个匹配列,避免重复触发
tables = []
for start_row, start_col in table_starts:
# 向下扫描确定行数:从start_row开始,直到某行在start_col列为空
end_row = start_row
while end_row <p>✅ <strong>关键优势</strong>: </p>
- 自动跳过空白行/列,仅保留连续非空数据块;
- 坐标定位鲁棒性强,不依赖固定偏移或硬编码行列数;
- 支持自定义关键词(如 "Summary"、"Config"),易于适配不同模板。
⚠️ 注意事项:
- 若表格内部存在合法空单元格(如可选字段留空),当前逻辑会提前截断。此时需改用更精细策略:先扫描首行确定列宽,再逐列向下探测有效行数;
- 列名处理需根据业务判断:若首行是标题,建议启用注释代码段将其设为 columns;若标题需保留在数据中,则保持原样;
- 大文件建议添加 dtype=str 参数防止数值型列自动转换导致精度丢失。
该方法将非结构化Excel转化为结构化DataFrame列表,为后续分析、校验或入库奠定坚实基础。











