Я использую python openpyxl для работы с l oop в excel - PullRequest
0 голосов
/ 05 мая 2020

У меня есть данные со специальной структурой. Данные сгруппированы, как показано на скриншоте. Структура данных

Используя python, я определил уровни структуры данных, и я хочу установить эту информацию об уровнях в ячейках для каждой строки, например, в новом столбце , столбец = 8. Я использую код

import openpyxl as opx

wb=opx.load_workbook('./sources/example.xlsx')
print(wb.sheetnames)
ws=wb.active
print(ws.max_row)

for row_index, row in enumerate(ws.iter_rows(min_col=2, min_row=2, max_col=ws.max_column+1, max_row=ws.max_row+1)):
    ws.cell(row=row_index,column=8).value=ws.row_dimensions[row_index].outline_level
    print(row_index, ws.row_dimensions[row_index].outline_level)

 wb.save('./sources/test.xlsx')

Но я получаю трассировку

Traceback (последний вызов последним): File «C: / Users / lisit / PycharmProjects / File_parsing / test_l oop. py ", строка 11, в ws.cell (row = row_index, column = 8) .value = ws.row_dimensions [row_index] .outline_level File" C: \ Users \ lisit \ Python \ lib \ site-packages \ openpyxl \ worksheet \ worksheet.py ", строка 236, в ячейке поднять ValueError (" Значения строки или столбца должны быть не менее 1 ") ValueError: Значения строки или столбца должны быть не менее 1

Не могли бы вы мне помочь исправить?

1 Ответ

0 голосов
/ 05 мая 2020

Проблема

row_index начинается с 0 (перечислить поведение по умолчанию)

for row_index, row in enumerate(ws.iter_rows(min_col=2, min_row=2, max_col=ws.max_column+1, max_row=ws.max_row+1)):

Два варианта исправления

Либо: используйте row_index + 1

ws.cell(row=row_index+1,column=8).value=ws.row_dimensions[row_index+1].outline_level

Или установите параметр запуска по умолчанию на 1, то есть enumerate (..., start = 1)

for row_index, row in enumerate(ws.iter_rows(min_col=2, min_row=2, max_col=ws.max_column+1, max_row=ws.max_row+1), start = 1):
...