如何用Openpyxl获取.xlsx合并单元格间行数据并匹配所属分类
解决Openpyxl提取合并分类标题下数据的问题
核心问题说明
你遇到的MergedCell无.coordinate属性的问题,是因为合并区域内除左上角单元格外,其他单元格都是MergedCell对象——这类对象仅作为合并标记,没有独立坐标和值,实际标题值存储在合并区域的左上角单元格。下面是具体的解决方案:
步骤1:加载工作表并收集分类信息
先遍历工作表的所有合并单元格范围,筛选出目标分类标题,并记录每个分类对应的数据起始行:
from openpyxl import load_workbook # 加载本地Excel文件(注意:Google Docs的表格需先导出为.xlsx再处理) wb = load_workbook("your_file.xlsx") ws = wb.active # 存储分类名称与数据行范围 category_ranges = [] # 遍历所有合并单元格区域 for merged_range in ws.merged_cells.ranges: # 获取合并区域左上角单元格的标题值 title_cell = ws.cell(row=merged_range.min_row, column=merged_range.min_col) category_name = title_cell.value # 筛选你需要的分类(可根据实际标题调整) if category_name in ["Processors", "Motherboards"]: # 数据从分类标题行的下一行开始 category_ranges.append({ "name": category_name, "start_row": merged_range.max_row + 1, "end_row": None }) # 为每个分类设置数据结束行(下一个分类的起始行-1) for i in range(len(category_ranges)-1): category_ranges[i]["end_row"] = category_ranges[i+1]["start_row"] - 1 # 最后一个分类的结束行是工作表最大行 if category_ranges: category_ranges[-1]["end_row"] = ws.max_row
步骤2:提取各分类下的数据
根据上面记录的行范围,提取对应分类的数据:
# 存储最终结果:分类名 -> 数据行列表 category_data = {} for cat in category_ranges: cat_name = cat["name"] start = cat["start_row"] end = cat["end_row"] # 跳过无数据的分类 if start > end: category_data[cat_name] = [] continue # 提取数据(示例假设数据在第1-3列,可根据实际表格调整列范围) rows = [] for row_num in range(start, end+1): row_values = [ws.cell(row=row_num, column=col).value for col in range(1,4)] rows.append(row_values) category_data[cat_name] = rows # 输出结果示例 for name, data in category_data.items(): print(f"=== {name} ===") for line in data: print(line)
关键注意事项
- Google Docs表格处理:需先将Google Sheets导出为
.xlsx格式,再用Openpyxl加载处理,无法直接读取在线链接。 - 合并单元格操作:永远通过
ws.merged_cells.ranges获取合并区域范围,不要直接操作MergedCell对象。 - 列范围调整:代码中列范围
range(1,4)对应第1到第3列,需根据你的表格实际数据列修改。
内容的提问来源于stack exchange,提问作者Be Different
相关产品推荐
相关产品推荐

