如何使用openpyxl交换列

时间:2019-07-17 16:32:46

标签: python-2.7 openpyxl

我有.xlsx文件。行是好的,值也很好。但是我需要通过新列位置列表来更改列顺序,例如: old = [1, 2, 3, 4] new = [2, 1, 4, 3]

已检查文档-没有针对此问题的简单选择。 我试图遍历列,所以:

old = {cell.column: cell.value for cell in ws[1]}.keys() # [1, 2, 3, 4]
new = [2, 1, 4, 3]

for i, col in enumerate(ws.iter_cols(max_col=old[-1]), 1):
    if old[i-1] != new[i-1]:
        for one in ws[get_column_letter(i)]:
            old_cell = one
            new_cell = ws.cell(old_cell.row, old[new[i-1]]-1)
            new_cell.value, old_cell.value = old_cell.value, new_cell.value
        old[i] = new_cell.column
        old[new_cell.column] = old_cell.column

...但是它仅在少数情况下有效。可能我缺少一些通用的解决方案。

在和它应该是old = [1, 2, 3, 4] new = [2, 1, 4, 3]

输入文件:

x A  B  C  D 
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C3 D4

输出文件:

x A  B  C  D 
1 B1 A1 D1 C1
2 B2 A2 D2 C2
3 B3 A3 D3 C3
4 B4 A4 D3 C4

1 个答案:

答案 0 :(得分:0)

您当前的方法存在覆盖单元的风险。我很想按正确的顺序将单元从现有列移到新列,然后删除旧列。

for c in ws['A']:
    new_cell = c.offset(column=6)
    new_cell.value = c.value

for c in ws['B']:
    new_cell = c.offset(column=5)
    new_cell.value = c.value

ws.delete_cols(min_col=1, max_col=4)

这只是为了给您提供可以优化和参数化的总体思路,以便您可以一次完成每一行。

或者您可以使用move_range:

ws.move_range(min_col=1, max_col=1, min_row=1 max_row=ws.max_row, cols=5)

在任何一种情况下,请注意不要在移动现有单元之前覆盖它们。