使用Python Openpyxl拆分Excel多行单元格实现结构化表格输出
多行嵌套分类Excel扁平化实现方案
核心识别规则替换
废弃原有的字符串长度判断逻辑,基于源文件自带的格式特征做确定性识别:
- 无前置空格/制表符的行,判定为所属分类项,用于更新当前遍历的分类上下文
- 带前置空格/制表符的行,判定为具体产品名称项,直接绑定当前上下文的分类与对应产品编码生成独立记录
这套规则完全匹配源数据的格式约定,不存在长度判断带来的识别错位问题(比如短分类名、长产品名导致的逻辑错判)。
落地实现逻辑
- 逐行扫描源表,提取每行对应的产品编码与多行混合分类内容
- 拆分多行内容为独立行列表,维护临时变量存储当前正在遍历的分类值
- 遍历拆分后的每一行内容:遇到分类行就更新临时分类值,遇到名称行就把产品编码、当前分类、产品名组装为一条扁平化记录存入结果列表
- 新建输出工作簿,写入表头与所有扁平化记录,保存为独立结果文件
可直接运行的完整代码
from openpyxl import load_workbook, Workbook # 按需修改为实际的文件路径 SOURCE_EXCEL = "你的源文件.xlsx" OUTPUT_EXCEL = "扁平化输出结果.xlsx" # 加载源文件 src_wb = load_workbook(SOURCE_EXCEL, data_only=True) src_ws = src_wb.active result_rows = [] TABLE_HEADERS = ["Product", "Classification", "Name"] # 从第2行开始遍历源数据,跳过第一行表头 for row_data in src_ws.iter_rows(min_row=2, values_only=True): # 按需调整列索引:索引从0开始,0为第一列,根据实际表的列位置修改 product_code = row_data[0] mixed_content = row_data[1] # 跳过空值行 if not product_code or not mixed_content: continue content_lines = str(mixed_content).split("\n") current_category = "" for line in content_lines: trimmed_line = line.strip() # 跳过拆分产生的空行 if not trimmed_line: continue # 识别带前置空格/制表符的名称行 if line.startswith((" ", "\t")): result_rows.append([ product_code, current_category, trimmed_line ]) else: # 更新当前遍历的分类值 current_category = trimmed_line # 写入输出文件 out_wb = Workbook() out_ws = out_wb.active out_ws.append(TABLE_HEADERS) for record in result_rows: out_ws.append(record) out_wb.save(OUTPUT_EXCEL) print(f"处理完成,共生成{len(result_rows)}条有效记录,文件已保存至{OUTPUT_EXCEL}")
使用注意事项
- 列索引调整:代码默认Product为第一列、混合分类/名称为第二列,实际使用时根据源表的列位置修改
row_data[0]和row_data[1]的索引值即可 - 缩进兼容:识别逻辑同时支持普通空格、制表符作为前置缩进的情况,避免录入时混用缩进格式导致识别失败
- 空值容错:代码内置了空单元格、拆分空行的跳过逻辑,不会因零散的空值触发运行报错
内容的提问来源于stack exchange,提问作者R_K
相关产品推荐
相关产品推荐

