Ошибка IndexError: tuple index out of range при записи xlsx файла

Рейтинг: 0Ответов: 1Опубликовано: 19.07.2023
import tkinter
import openpyxl

output_list = {
    'sheet': 2,
    'PN': 0.7,
    'PS': 2,
    'insulation': 1,
    'TN25': 29,
    'putty': 0.6,
    'reinforcing tape': 1.5,
    'dowel': 1.6,
    'sealing tape': 1.2,
    'primer': 0.2
}

def click_buttom():
    book = openpyxl.Workbook()
    sheet = book.active

    row = 1
    for key in output_list:
        sheet[row][0].value = key
        sheet[row][1].value = output_list.get(key)
        row += 1

        book.save('my_book.xlsx')
        book.close()

window = tkinter.Tk()
btn = tkinter.Button(window, text='Рассчитать', width='19', height='2', command=click_buttom)
btn.pack()

Пытаюсь сделать калькулятор для расчета количества материала для перегородки. Результат вычислений помещаю в промежуточный словарь и сохраняю в таблицу Excel 0-вой столбец сохраняется корректно, но при попытке заполнить следующий столбец получаю ошибку: IndexError: tuple index out of range. На гуглить объяснение этой проблемы мне не удалось, в Youtobe нашел видео с записью в Excel JSON файла - https://www.youtube.com/watch?v=VQNV_oOdOqo&t=435s и при вроде аналогичной записи все работает.

Ответы

▲ 1Принят

Вы не проверили, что происходит, когда мы обращаемся какому-то индексу sheet в новой таблице, когда ячейки еще не созданы:

book = openpyxl.Workbook()
sheet = book.active
row = 1
sheet[row]

Возвращает (<Cell 'Sheet'.A1>,). Очевидно, что длина у этого tuple - 1, и попытка доступа ко второму элементу даст IndexError.

Одно из решений - доступ к ячейкам через адрес: sheet['B33']

Но раз вы только записываете данные в книгу, может быть книга в режиме только на запись подойдет вам лучше?

Например так:

wb = openpyxl.Workbook(write_only=True)
ws = wb.create_sheet()
for key, value in output_list.items():
    ws.append([key, value])

wb.save('my_book.xlsx')
wb.close()