Как то вы неправильно структурируете данные. Мне лень набирать экселевский файл поэтому так:
1 строка это заголовок - оттуда нужно извлечь массив чисел.
все стороки со второй - первая колонка "ключ", со второй колонки данные.
причем данные нужно тоже по ключам рассортировать чтобы получить в итоге структуру:
rows={"Иванов Иван":{1:3,5:4,11:4,29:3},"Петров Петр":{1:5,5:5,11:3,29:5}}
Чтобы потом и извлечь оценка за 29 число: rows["Иванов Иван"][29]
from openpyxl import Workbook
##Для примера создадим книгу в памяти вместо загрузки файла
wb = Workbook()
ws1 = wb.active
ws1.append(['ФИО', '1', '5', '11', '29'])
ws1.append(['Иванов Иван', '3', '4', '4', '3'])
ws1.append(['Петров Петр', '5', '5', '3', '5'])
#Основной код
rows={}
dates = [int(x.value) for x in ws1.iter_rows(min_col=2,max_row=1).send(None)]#тут [1, 5, 11, 29]
for row,name in enumerate([x.value for x in ws1.iter_cols(max_col=1,min_row=2).send(None)],2):#тут ['Иванов Иван', 'Петров Петр']
rows[name]={}
for col,date in enumerate(dates,2):
rows[name][date] = ws1.cell(row,col).value
print(rows['Иванов Иван'][29])
## или все оценки
print(list(rows['Иванов Иван'].values()))
enumerate(array,start) перечисляет массив и позволяет избежать всяких
k=k+1iter_rows и
iter_cols - получают строки и колонки, возвращают генератор из которого берем первое значение функцией
send(None)