使用Python和Openpyxl循环.xlsx,但循环只保存最后一行';s数据

使用Python和Openpyxl循环.xlsx,但循环只保存最后一行';s数据,python,excel,openpyxl,Python,Excel,Openpyxl,我是一个Python新手,我正在从事一个项目来自动化一个非常耗时的项目。我使用openpyxl访问.xlsx来提取信息,这些信息最终将转换为距离和方向角,以与arcpy/arcgis一起使用,这意味着我使用的是Python 2.7。我可以访问数据并进行第一轮更改,但无法将write命令集成到循环中。目前,它将最后一行的数据保存到新.xlsx中给定范围内的所有单元格中。这是我的密码: #Importing OpenPyXl and loads the workbook and sheet imp

我是一个Python新手,我正在从事一个项目来自动化一个非常耗时的项目。我使用openpyxl访问.xlsx来提取信息,这些信息最终将转换为距离和方向角,以与arcpy/arcgis一起使用,这意味着我使用的是Python 2.7。我可以访问数据并进行第一轮更改,但无法将write命令集成到循环中。目前,它将最后一行的数据保存到新.xlsx中给定范围内的所有单元格中。这是我的密码:

#Importing OpenPyXl and loads the workbook and sheet

import openpyxl
wb = openpyxl.load_workbook('TESTVECT.xlsx')
ws = wb.get_sheet_by_name('TEST')

#allows to save more than once

write_only = False

cell_range = ws['C']

#sorts through either the rows/columns and slices the required string

maxRow = ws.max_row + 1
for row in range(2, maxRow):
    parID = ws['A' + str(row)].value
    Lline = ws['B' + str(row)].value
    Vect = ws['C' + str(row)].value
    print parID, Lline, Vect
    trash, keep = Vect.split("C")

#This part save the very last row to all rows in available columns
#need a way to integrate the save functionality so each row is unique

for rowNum in range(2, maxRow):
    ws.cell(row=rowNum, column=3).value = keep
for rowNum in range (2, maxRow):
    ws.cell(row=rowNum, column=1).value = parID
for rowNum in range (2, maxRow):
    ws.cell(row=rowNum, column=2).value = Lline

#Only prints the very last keep entry from the .xlsx    

print keep

print "all done"

#Saving does not write all of the the 'keep, parID, and Lline' records
#There is an issue with the for loop and integrating the write portion of
#the code.

wb.save('TESTMONKEYVECT.xlsx')
有人能给我一些关于我在写过程中做错了什么的建议吗?我需要每一行在修改后保留其唯一的数据


谢谢你,

你的直觉是正确的,你需要组合循环。第一个循环遍历每一行,并将
parID
Lline
保存在每个变量的最后一个值上。在循环之后,它们只有最后一行的值,因为这是唯一一行没有另一行出现并覆盖值的行

您可以通过将操作组合到单个循环中来解决此问题

maxRow = ws.max_row + 1
for row in range(2, maxRow):
    parID = ws['A' + str(row)].value
    Lline = ws['B' + str(row)].value
    Vect = ws['C' + str(row)].value
    print parID, Lline, Vect
    trash, keep = Vect.split("C")

    ws.cell(row=rowNum, column=3).value = keep
    ws.cell(row=rowNum, column=1).value = parID
    ws.cell(row=rowNum, column=2).value = Lline

你的直觉是正确的,你需要组合循环。第一个循环遍历每一行,并将
parID
Lline
保存在每个变量的最后一个值上。在循环之后,它们只有最后一行的值,因为这是唯一一行没有另一行出现并覆盖值的行

您可以通过将操作组合到单个循环中来解决此问题

maxRow = ws.max_row + 1
for row in range(2, maxRow):
    parID = ws['A' + str(row)].value
    Lline = ws['B' + str(row)].value
    Vect = ws['C' + str(row)].value
    print parID, Lline, Vect
    trash, keep = Vect.split("C")

    ws.cell(row=rowNum, column=3).value = keep
    ws.cell(row=rowNum, column=1).value = parID
    ws.cell(row=rowNum, column=2).value = Lline

很抱歉,我对这个话题很陌生,但这个例子可能有帮助:

#create loop to read from column of opened file and print from specific column row by row
i = 1
while i <= row_count:
    ws_write.cell(row=i, column=col_write, value=sheet_read.cell(i, col_read).value)
    i += 1
#创建循环以从打开文件的列中读取,并从特定列逐行打印
i=1

虽然我很抱歉,我对这个话题很陌生,但也许这个例子有帮助:

#create loop to read from column of opened file and print from specific column row by row
i = 1
while i <= row_count:
    ws_write.cell(row=i, column=col_write, value=sheet_read.cell(i, col_read).value)
    i += 1
#创建循环以从打开文件的列中读取,并从特定列逐行打印
i=1

而我认为这是完美的!非常感谢你!这个小脚本将能够在最初更新10000多条记录,然后在日常维护期间节省时间。这是一个很大的帮助,我将使用这个语法在即将到来的项目以及。谢谢。这个很好用!非常感谢你!这个小脚本将能够在最初更新10000多条记录,然后在日常维护期间节省时间。这是一个很大的帮助,我将使用这个语法在即将到来的项目以及。非常感谢。