I’m trying to copy a row, based upon cell value, and edit the 6th colmn value with the ‘VAL’ key values.
For example row 10 contains “A1”
The first column must get the first value of the VAL: A1 (AAA) and the second A1: (BBB).
Now it populates the first (and second) with the second BBB value.
I know it’s because of the loop that overwrites the first value, but I can’t seem to pinpoint the point where to make it skip after the first itteration.
Any help is appreciated!
Please see the sample code:
from openpyxl.utils import rows_from_range
from openpyxl import load_workbook
# key values:
VAL = {
'A1': ['AAA', .5, 'BBB', .5],
'B1': ['CCC', .333, 'DDD', .333, 'EEE', .333],
'C1': ['CCC', .5, 'DDD', .5],
'D1': ['FFF', .05, 'BBB', .4, 'AAA', .4, 'EEE', .05, 'GGG', .1],
'E1': ['AAA', .5, 'GGG', .5]
}
def copy_range(range_str, ws, offset, insert_point):
""" Copy cell values and style to the new row using offset"""
# Insert empty Row
ws.insert_rows(insert_point, offset)
for row in rows_from_range(range_str):
for cell in row:
dst_cell = ws[cell].offset(row=offset, column=0)
src_cell = ws[cell]
flag = 0
for key in VAL:
if dst_cell.value == key:
for i in range(int(len(VAL[key]) / 2)):
flag += 2
dst_cell.value = list(VAL[key])[flag - 2]
# Populate new Cell value
src_cell.value = dst_cell.value
file = 'C:/TEMP/TEST/File.xlsx'
wb = load_workbook(file)
ws = wb[f'Sheet1']
# start at row 4
for row in ws.iter_rows(4):
for cell in row:
# look at column 6 for key value
if cell.column is 6 and 'A1' in cell.value:
# Get Rownumber to insert
insert_point = cell.row
# Row range to be copied
row_range = f'A{cell.row}:P{cell.row}'
# Offset to the new row
row_offset = 1
# Copy cell values to new row
copy_range(row_range, ws, row_offset, insert_point)
# Save workbook
wb.save(f"{file}--edit.xlsx")