如何用openpyxl分离提取Excel表格与普通单元格数据
提取Excel中非表格区域的普通单元格数据(基于openpyxl)
要提取Excel中不属于「插入表格」创建的专用表格的普通单元格数据,关键是先把所有表格的单元格范围标记出来,遍历工作表时跳过这些区域的单元格就行。openpyxl自带工具能解析表格的范围字符串,用这个来实现排除逻辑最稳妥。
完整代码实现
import pandas as pd from openpyxl import load_workbook from openpyxl.utils import range_boundaries # Load the workbook workbook_path = '/path/to/your/excel/file.xlsx' workbook = load_workbook(workbook_path) # 存储每个工作表的非表格数据 non_table_dataframes = {} # 遍历所有工作表 for sheet_name in workbook.sheetnames: worksheet = workbook[sheet_name] non_table_data = [] excluded_ranges = [] # 收集所有表格的单元格范围(起止行、起止列) if worksheet.tables: for table in worksheet.tables.values(): # 解析表格的ref字符串为具体的行列边界 min_col, min_row, max_col, max_row = range_boundaries(table.ref) excluded_ranges.append((min_row, max_row, min_col, max_col)) # 遍历每个单元格,跳过表格内的单元格 for row in worksheet.iter_rows(): current_row_data = [] for cell in row: # 判断当前单元格是否在表格范围内 is_in_table = False for (min_r, max_r, min_c, max_c) in excluded_ranges: if min_r <= cell.row <= max_r and min_c <= cell.column <= max_c: is_in_table = True break # 不在表格内则保留值,否则填充None(维持原行列结构) current_row_data.append(cell.value if not is_in_table else None) # 可选:过滤掉排除表格后完全为空的行 if any(val is not None for val in current_row_data): non_table_data.append(current_row_data) # 生成非表格数据的DataFrame non_table_dataframes[sheet_name] = pd.DataFrame(non_table_data) if non_table_data else pd.DataFrame() # 查看指定工作表的非表格数据 sheet_name_to_access = 'Sheet1' print(non_table_dataframes[sheet_name_to_access])
关键逻辑说明
- 解析表格范围:用
openpyxl.utils.range_boundaries直接将表格的ref字符串(如"A1:C5")转换成行列边界值,避免手动解析字符串的错误。 - 标记排除区域:把所有表格的起止行、起止列存储在列表中,后续用来快速判断单元格是否属于表格。
- 过滤单元格:遍历每个单元格时,检查其坐标是否在表格范围内,不在则保留值;若想完全移除表格位置的占位(不保留None),可修改内层逻辑直接跳过该单元格,但会导致行列结构变化,需根据需求调整。
- 过滤空行:可选步骤,剔除掉排除表格后完全为空的行,减少DataFrame中的无效数据。
内容的提问来源于stack exchange,提问作者Sagar Nikesh
相关产品推荐
相关产品推荐

