You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Openpyxl技术问题:如何按列遍历并按条件复制排序Excel数据

问题分析与解决

你的代码只复制最后一个值的核心原因有两个:

  1. 目标行号固定不变:你一开始获取的mr2是目标表初始的最大行,之后所有写入操作都用mr2 + 1,相当于所有符合条件的数据都被写到同一行,后面的数据会覆盖前面的,最终只剩最后一条。
  2. 循环逻辑冗余:内层循环遍历所有列完全没必要,你只需要根据A列(第1列)的值来分类,不需要遍历每一列判断。

修正后的代码

from openpyxl import load_workbook

wb = load_workbook('testData.xlsx')
wb2 = load_workbook('testTemplate.xlsx')

ws = wb['Sheet1']
ws2 = wb2['Sheet1']

# 获取源数据的最大行
mr = ws.max_row
# 为每个分类初始化目标行号,从目标表的下一行开始
row_a = ws2.max_row + 1
row_b = ws2.max_row + 1
row_c = ws2.max_row + 1

# 遍历源数据的每一行(从第2行开始,假设第1行是表头)
for i in range(2, mr + 1):
    # 获取A列的分类值
    category = ws.cell(row=i, column=1).value
    # 获取要复制的对应数据(这里假设是B列的值,可根据实际需求调整列号)
    data = ws.cell(row=i, column=2).value
    
    if category == "A":
        ws2.cell(row=row_a, column=1).value = data
        row_a += 1  # A分类的行号自增,下次写入下一行
    elif category == "B":
        ws2.cell(row=row_b, column=2).value = data
        row_b += 1
    elif category == "C":
        ws2.cell(row=row_c, column=3).value = data
        row_c += 1

wb2.save('testTemplate.xlsx')

关键改动说明

  • 为A、B、C三个分类分别维护独立的行计数器,每次写入后行号加1,确保每个分类的数据逐行填充,不会互相覆盖。
  • 直接遍历源数据的行,只检查A列的分类值,去掉冗余的列遍历,逻辑更简洁。
  • 明确指定要复制的数据源列(示例中为B列,你可以根据实际表格结构调整column=2的数值)。

内容的提问来源于stack exchange,提问作者Wolk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:31:17