我有.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
答案 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)
在任何一种情况下,请注意不要在移动现有单元之前覆盖它们。