如何在python中使用openpyxl将excel文件中的特定单元格移动到新列



我正在尝试将一些特定的单元格移动到指定的位置。如图所示,希望将单元格D3中的数据移动到E2, D5到E4,.....以此类推。openpyxl是否可行?任何建议都将非常感谢!!点击查看图片

这是我到目前为止得到的。

wb=xl.load_workbook(datafile)
ws=wb['Sheet1']
#insert a new column #5
ws.insert_cols(idx=5,amount=1)
wb.save(datafile)
mr=ws.max_row

#move cells
for i in range (1,mr+1):
v=ws.cell(row = i+1,column=4) 
ws.cell(row=i,column =5).value=v.value
wb.save(datafile)
wb.close

谢谢你的帮助。

我修改了代码,它运行良好。然后我想删除不需要的行,它没有工作。看起来它进入了一个无限循环。代码显示在这里。我做错了什么?

wb=xl.load_workbook(datafile)
ws=wb['Sheet1']
#insert a new column #5
ws.insert_cols(idx=5,amount=1)
#Calculate total number of rows 
mr=ws.max_row

#move cells
for i in range (2,mr,2):
ws.cell(row=i,column=5).value=ws.cell(row=i+1,column=4).value
#delete unwanted rows
for i in range (2,mr,2):
ws.delete_rows(idx=i+1,amount=1)

wb.save(datafile)

这是一个很好的努力。



  1. 通常只需要在所有编辑结束时保存一次工作簿,除非您要制作多个副本。所以wb。
  2. 这里不需要使用"mr + 1"。只有值"mr"是好的,它匹配行数。
  3. 如果只是将值从一个单元格复制到另一个单元格,则不需要分配中间变量。将新的单元格值分配给一行中的现有单元格值,如图所示。但是,如果您想使用变量'v'作为中间值,则可以。
  4. wb。close应该是wb.close(),但是不会对这个工作簿做任何事情只影响只读和只写模式这是打开工作簿时的一个方法。所以不需要写这一行。

要跳过行,可以在范围中设置步进。步进是范围参数中的最后一个数字。所以

range(2, mr, 2)

表示'i'从2开始,增加到最大值[ws]。Max_row]以2为增量。
在这种情况下,因为最大值是7,所以i将是2,4和6


wb = xl.load_workbook(datafile)
ws = wb['Sheet1']
# insert a new column #5
ws.insert_cols(idx=5, amount=1)
# wb.save(datafile)  # <--- not necessary just save at the end
mr = ws.max_row
# move cells
# Move and delete the rows by making the changes from the bottom up
for i in reversed(range(2,mr,2)):
ws.cell(row=i, column=5).value = ws.cell(row=i + 1, column=4).value
ws.delete_rows(idx=i + 1, amount=1)
wb.save(datafile)
# wb.close  # <-- Not needed, should have brackets anyway

#----附加信息----#
删除的问题是;当你删除一行时,下面的行会立即上移。因此,如果你删除第2行,那么第3行就变成了第2行,这意味着从顶部开始向下删除,像这样的模式通常是行不通的。
要删除不需要的行,可以反向运行循环,这样删除一行不会影响尚未更改的行。

最新更新