Openpyxl技术问题:如何按列遍历并按条件复制排序Excel数据
问题分析与解决
你的代码只复制最后一个值的核心原因有两个:
- 目标行号固定不变:你一开始获取的
mr2是目标表初始的最大行,之后所有写入操作都用mr2 + 1,相当于所有符合条件的数据都被写到同一行,后面的数据会覆盖前面的,最终只剩最后一条。 - 循环逻辑冗余:内层循环遍历所有列完全没必要,你只需要根据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
相关产品推荐
相关产品推荐

