基于第二列行值拆分Excel工作表的实现方案及现有openpyxl代码优化建议咨询
技术建议:基于openpyxl完成Excel工作表按列值拆分功能
看起来你已经搭好了数据分组的初步框架,接下来我们可以优化现有逻辑并完成将分组数据写入对应子工作表的核心功能。下面是具体的推进方案:
一、优化数据分组逻辑
你当前的多层循环收集数据的方式稍显繁琐,我们可以直接利用字典按状态分组存储行数据,逻辑更直观且高效:
- 把初始字典的空字符串替换为空列表,用于存储对应状态的所有行数据
- 遍历原工作表时,直接取第二列(索引为1)的值,匹配状态后将目标列数据存入对应列表
二、创建目标工作表并写入数据
分组完成后,需要为每个状态创建对应的工作表,并保证子表结构和原表一致:
- 检查工作簿中是否已存在该状态的工作表,不存在则新建,存在则清空原有数据(保留表头)
- 优先写入原工作表的表头,确保子表结构统一
- 将分组好的行数据逐行写入新工作表
三、完整改进代码示例
from openpyxl import load_workbook # 加载工作簿和激活原工作表 wb = load_workbook(r"spreadsheet.xlsx") ws = wb.active # 定义需要拆分的状态列表 statuses = ["NEW JOB", "DESIGN & AMENDS", "MARKETING", "R&D", "PRE-PRESS", "ON PROOF", "AWAITING ARTWORK", "HARD PROOF", "WAITING PARTS/PAPER", "READY TO PRINT", "URGENT", "PRINTING", "COVERS", "MONO", "OVERPRINT", "LAMINATING", "FOIL/SPOT GLOSS", "BINDING", "DIE CUTTING", "CREASING", "DRILLING", "TRIM", "FINISHING/PACKING", "DATA DUPLICATING", "OUTSOURCED", "WAITING COLLECTION", "DISPATCH SAME DAY", "DISPATCH NEXT DAY", "DISPATCH PDS", "DISPATCH POST", "DISPATCHED", "ON HOLD/WAITING INSTRUCTION", "COMPLETED & INVOICED", "CANCELLED", "COMPLETED"] # 初始化字典:每个状态对应一个空列表,用于存储行数据 status_rows = {status: [] for status in statuses} # 获取原表表头(假设第一行为表头) header = [cell.value for cell in ws[1]] # 遍历原工作表的行,从第二行开始(跳过表头) for row in ws.iter_rows(min_row=2, values_only=True): # 统一转大写,避免大小写不匹配导致的分组失败 current_status = str(row[1]).upper() if row[1] else None # 如果当前状态在目标列表中,存入对应分组 if current_status in status_rows: status_rows[current_status].append(row[:8]) # 遍历分组数据,创建并写入子工作表 for status, rows in status_rows.items(): # 处理已存在的工作表:清空原有数据(保留表头) if status in wb.sheetnames: target_ws = wb[status] target_ws.delete_rows(2, target_ws.max_row) # 新建不存在的工作表并写入表头 else: target_ws = wb.create_sheet(title=status) target_ws.append(header[:8]) # 写入分组好的行数据 for row_data in rows: target_ws.append(row_data) # 保存拆分后的工作簿(可选择覆盖原文件或另存为新文件) wb.save(r"split_spreadsheet.xlsx") print("工作表拆分完成!")
额外优化建议
- 大小写兼容:代码中通过
str(row[1]).upper()统一转换为大写,避免原表格中状态大小写不一致导致的匹配失败 - 空行处理:如果原工作表存在空白行,可以添加判断
if all(cell is None for cell in row): continue跳过空行 - 表头验证:如果原工作表第一行不是表头,可以调整
min_row为1,并去掉表头写入逻辑 - 性能优化:使用
iter_rows(values_only=True)直接获取单元格值,比遍历row对象更高效
内容的提问来源于stack exchange,提问作者AP100
相关产品推荐
相关产品推荐

