使用openpyxl在for循环内嵌if判断批量生成Excel工作簿的问题
Excel按指定列值拆分多工作簿实现方案
原有逻辑问题
- 遍历区间写法错误:
range(4, ws_1.max_row)为左闭右开区间,会漏掉源表最后一行数据 - 触发拆分条件时仅执行了保存操作,未实现新建工作簿、重置写入行计数的逻辑
- 直接复用源表行号写入目标表,拆分后新文件会出现大量空行,且无法正确连续写入
- 遍历结束后未保存最后一段数据,最后一个拆分出的文件会丢失
- 备注:描述的判断列为E列,初步尝试代码里写的是N列,按需调整列号即可
实现逻辑
- 提前初始化第一个待写入的工作簿、工作表,设置目标表初始写入行号为4,配置文件序号避免重名覆盖
- 逐行遍历源表,先读取判断列的值:
- 若值不等于4:将当前行B/C/D列数据写入当前活动目标表的对应行,目标表行号自增
- 若值等于4:保存当前正在写入的工作簿,新建空白工作簿作为新的写入目标,重置目标表写入行号为4,跳过当前标记行进入下一轮循环
- 所有行遍历完成后,手动保存最后一个未触发保存条件的工作簿
可直接复用的代码
from openpyxl import Workbook # 初始化写入状态 file_serial = 1 target_wb = Workbook() target_ws = target_wb.active target_write_row = 4 # 修正遍历区间,覆盖源表所有行 for source_row in range(4, ws_1.max_row + 1): # 如需判断N列,将E替换为N即可 split_flag = ws_1[f"E{source_row}"].value if split_flag == 4: # 保存当前已写入的文件 target_wb.save(f"split_data_{file_serial}.xlsx") file_serial += 1 # 新建工作簿重置写入状态 target_wb = Workbook() target_ws = target_wb.active target_write_row = 4 # 跳过当前标记行,从下一行开始写入新文件 continue # 正常写入B/C/D列数据 target_ws[f"B{target_write_row}"].value = ws_1[f"B{source_row}"].value target_ws[f"C{target_write_row}"].value = ws_1[f"C{source_row}"].value target_ws[f"D{target_write_row}"].value = ws_1[f"D{source_row}"].value target_write_row += 1 # 保存最后一段拆分数据 target_wb.save(f"split_data_{file_serial}.xlsx")
内容的提问来源于stack exchange,提问作者Ti No
相关产品推荐
相关产品推荐

