Python Forum

Full Version: openpyxl nested for loop help
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi i am new here and into coding with python ( thanks for patience :) ).
I am trying to write simple for loop which will use openpyxl to "search and replace" inside excel file and do this with the values in the list and save results as separate excel file for each list value.

import openpyxl
from openpyxl import load_workbook

wb = openpyxl.load_workbook('questions.xlsx')
ws = wb.worksheets[0]
ws2 = wb.worksheets[1]

list = ["value1", "value2"]


for account in list:
    for i in range(1, 3):
        if ws.cell(column=1, row=i).value is not None:
            ws.cell(column=1, row=i).value = ws.cell(
                column=1, row=i).value.replace(str("X"), account)
        for i in range(1, 125):
            if ws2.cell(column=2, row=i).value is not None:
                ws2.cell(column=2, row=i).value = ws2.cell(
                    column=2, row=i).value.replace(str("X"), account)
    wb.save('./test/' + 'questions_' + account + '.xlsx')
My result now is:
Two separate files called questions_value1.xlsx and questions_value2.xlsx
But inside both excel files "X" is replaced by value1 only.

Result i am looking for:
Two separate excel files called questions_value1.xlsx and questions_value2.xlsx where:
"X" will be replaced by value1 in file questions_value1.xlsx and by value2 in questions_value2.xlsx.

Can someone please explain to me where is the "catch"? I did a lot of reading and googling back and forth but end up only with broken code and messed up head :)

Thanks.
Hello,

Newbie here too :)
For what I understand, at loop 1 you replace all the "X" by "value1" in the object wb in memory. At loop 2 no "X" to be replaced wil be found in wb.

Creating a new destination file object at each loop can allow you to save the X replaced without impacting the original file

import openpyxl
from openpyxl import load_workbook
from openpyxl import Workbook #add
 
wb = openpyxl.load_workbook('questions.xlsx')
ws = wb.worksheets[0]
ws2 = wb.worksheets[1]
 
list = ["value1", "value2"]

for account in list:
    wdest=Workbook() #add
    wdest.create_sheet('result') #add
    Sheetdest=wdest['result'] #add
    for i in range(1, 3):
        if ws.cell(column=1, row=i).value is not None:
            Sheetdest.cell(column=1, row=i).value = ws.cell(column=1, row=i).value.replace(str("X"), account) #modify
        for i in range(1, 20):
            if ws2.cell(column=2, row=i).value is not None:
                Sheetdest.cell(column=2, row=i).value = ws2.cell(column=2, row=i).value.replace(str("X"), account)#modify
    wdest.save('./test/' +'questions_' + account + '.xlsx') #modify
Have a nice day :)
On a different note, you are mentioning "openpyxl" 3 times making it redudant.

Instead you could do:

import openpyxl

wb = openpyxl.load_workbook('questions.xlsx')
or

from openpyxl import load_workbook
 
wb = load_workbook('questions.xlsx')
or

from openpyxl import load_workbook as lowo
 
wb = lowo('questions.xlsx')
LocalFolder got it right.

Also, do not use "list" as a variable name. That name is already in use for the list type and assigning a value to it overwrites that connection in your program. If you were to use list() later in the program, it would raise an error. At the very least, you can add an underscore (list_) to distinguish it.