我正在尝试格式化多个将由单独的ETL程序使用的excel 2007文件。我只需要将行值上移一级。所以第3行的值,我想转移到第2行。
请耐心等待我,我是python和openpyxl的菜鸟。
我尝试迭代工作表并在循环内部使用ws.cell(param,param)我将行设置为-1但这似乎不起作用
我还尝试迭代行,并在循环内创建另一个迭代,它将从父循环开始max row-1并将值从subloop行分配给主循环行但是这似乎不起作用我错过了什么。
答案 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范围向右上移两行。
希望有帮助:)