Python openpyxl如何将行值移到当前位置-1?

时间:2017-02-01 02:30:30

标签: python openpyxl

我正在尝试格式化多个将由单独的ETL程序使用的excel 2007文件。我只需要将行值上移一级。所以第3行的值,我想转移到第2行。

请耐心等待我,我是python和openpyxl的菜鸟。

我尝试迭代工作表并在循环内部使用ws.cell(param,param)我将行设置为-1但这似乎不起作用

我还尝试迭代行,并在循环内创建另一个迭代,它将从父循环开始max row-1并将值从subloop行分配给主循环行但是这似乎不起作用我错过了什么。

3 个答案:

答案 0 :(得分:1)

创建一个名为“demo.py”的新文件并复制以下内容 进去。这应该做一些接近你想要的东西。希望评论(以及先决条件谷歌搜索)将 给你一个很好的迹象表明发生了什么。这将采用现有的电子表格和您要从中移动的起始行。它将执行操作,如果起始行#小于现有行,它将添加一个空行并将其余源行附加到其原始行号。为了安全起见,它会将结果转储到新的工作簿中。

import sys
import os
from openpyxl import load_workbook, Workbook

# check that you have 2 command line arguments to use
if len(sys.argv)!=3:
   sys.exit("Usage demo.py xls_filename start_line")

# ensure you have an existing file
if not os.path.isfile(sys.argv[1]):
   sys.exit("input file does not exist")
excelFile=sys.argv[1]

# make sure the starting row is a number!
if not (sys.argv[2]).isdigit(): 
   sys.exit("2nd argument must be a digit")
num=int(sys.argv[2])

# make sure your extension is okay 
root,ext = os.path.splitext(excelFile)
if not ext in ['.xls','.xlsm','.xlsx','.xlsb']:
   sys.exit("%s does not have an allowable excel extension"%excelFile)
newExcelFile=root + '_new' + ext

# open the source (1) and destination (2) workbooks & worksheets
wb1 = load_workbook(excelFile)
wb2 = Workbook()
ws1 = wb1.active
ws2 = wb2.active

# move each source row up one in the destination 
# starting from row 1 to num
num=min(num,ws1.max_row)
for i in range(1,num):
  ws2.append(ws1.rows[i])

if num<ws1.max_row:
  # append a blank row
  ws2.append(tuple())
  # copy the rest of the rows
  for i in range(num,ws1.max_row):
    ws2.append(ws1.rows[i])

# save the destination workbook
wb2.save(newExcelFile)

请注意,您将丢失源工作表的第一行 - 这可能不是您想要的。

我必须在这里添加一个免责声明:我不能保证它的健壮性/完整性,因为我的python生锈了,我只使用'win32com'来做类似的事情。我将进一步开发(和调试)给你,但如果有问题请告诉我。

答案 1 :(得分:1)

from openpyxl import Workbook
from openpyxl import load_workbook

wb = load_workbook("sample.xlsx")

ws1 = wb.active
ws2 = wb.create_sheet("modifiedSheet")

start_row = 3
start_col = 1

for row in ws1.iter_rows(min_row=start_row):
    for cell in row:
        # print(cell.value)
        ws2.cell(row = start_row-2, column = start_col, value=cell.value) # start_row - 2 will assign the value to the same column up 2 rows
        start_col += 1 # increment the column, for use of destination sheet
    start_row += 1 # increment the column, for use of destination sheet
    start_col = 1 # reset to first column after row processing

wb.save("modified.xlsx")

这不是动态的,但可以完成工作

答案 2 :(得分:0)

您可以使用openpyxl move_range函数。

ws.move_range("D4:F10", rows=-1, cols=2)

这会将D4:F10范围向右上移两行。

希望有帮助:)