如何使用Python提取Excel同一工作表中不同位置的多个表格
Python 提取同工作表分散表格的非索引定位方法
以下是不需要提前知道表格位置索引的常用提取方案,按适用场景从高到低排序:
- 结构化表格直接读取
如果Excel中的4个表格是官方插入的结构化表格(即通过「插入」-「表格」功能创建的带表名、可筛选的表格,不是手动填充的普通单元格区域),可以直接通过openpyxl的内置接口直接获取所有表格对象,完全不需要定位坐标:
from openpyxl import load_workbook import pandas as pd wb = load_workbook("目标文件.xlsx", data_only=True) ws = wb["Sheet1"] tables = [] for excel_table in ws.tables.values(): # 直接读取表格覆盖的单元格范围 table_range = ws[excel_table.ref] # 转换为DataFrame df = pd.DataFrame([[cell.value for cell in row] for row in table_range]) # 首行设为表头 df.columns = df.iloc[0] df = df[1:].reset_index(drop=True) tables.append(df)
- 空边界自动识别
如果是普通的单元格块,且表格之间用空行/空列分隔,可以通过遍历所有有值的单元格,聚类出连续的非空矩形区域,每个区域就是一个独立表格:
from openpyxl import load_workbook import pandas as pd from itertools import groupby wb = load_workbook("目标文件.xlsx", data_only=True) ws = wb["Sheet1"] # 收集所有非空单元格的坐标 filled_cells = [(cell.row, cell.col_idx) for cell in ws if cell.value is not None] all_rows = sorted({r for r, c in filled_cells}) # 按连续行拆分不同表格的行范围 row_ranges = [] for _, g in groupby(enumerate(all_rows), lambda x: x[0]-x[1]): group = [i[1] for i in g] row_ranges.append((min(group), max(group))) tables = [] for start_r, end_r in row_ranges: # 匹配当前行范围对应的非空列区间 cols = [c for r, c in filled_cells if start_r <= r <= end_r] start_c, end_c = min(cols), max(cols) # 读取表格内容 data = ws.iter_rows(min_row=start_r, max_row=end_r, min_col=start_c, max_col=end_c, values_only=True) df = pd.DataFrame(data) df.columns = df.iloc[0] df = df[1:].reset_index(drop=True) tables.append(df)
- 表头关键词匹配定位
如果提前知道每个表格的固定表头关键词(比如第一个表表头含「订单ID」,第二个含「客户姓名」),可以先全局搜索表头所在行,再向下/向右扩展到空行空列确定表格范围,这种方法抗位置变动能力极强,不会识别到无关内容。 - 格式特征识别
如果表格有统一的排版规范(比如表头统一加粗、有特定背景色、边框),可以读取单元格样式属性,将符合表头样式的单元格作为表格起始点,再扩展范围提取完整表格,适合格式标准化的企业报表场景。
内容的提问来源于stack exchange,提问作者codette
相关产品推荐
相关产品推荐

