#python-3.x #openpyxl
#python-3.x #openpyxl
Вопрос:
Мне нужно использовать openpyxl
для выполнения приведенного ниже. У меня есть несколько листов со столбцом, скажем, C, со значениями, указанными ниже, и мне нужно выбрать только последнее значение из каждого блока:
C
Student Fees
1223
3345
123
Student Fees
110
111
1111
345
-1923
Student Fees
267
4566
3456
Итак, мой вывод должен быть таким:
123
-1923
3456
Я пытаюсь сделать это с помощью приведенного ниже кода:
for cell in WS['C']:
if(cell.value is not None):
if(str(cell.value == 'Student Fees'):
print("{1}".format(cell.value, cell.offset(-1,0).value)
Я могу перебирать столбец total и печатать все, но я не могу понять, как печатать только необходимые последние значения. Как это сделать??
Ответ №1:
Вы можете легко сделать это, установив условия, которые должны быть выполнены: пустая ячейка под ячейкой, содержащей «Студенческие сборы».
marker = False
for cell in ws['C']:
if cell.value and if cell.value == "Student Fees":
marker = True
elif marker and if cell.value is None:
print(cell.offset(row=-1).value)
marker = False
Комментарии:
1. У меня есть несколько листов, и это работает для большинства из них, но для некоторых это выдает ошибку ValueError. Есть идеи, почему это может происходить? Индекс строки, равный -1, не должен быть проблемой, потому что он работает для большинства листов? Что вы думаете?
2. Вы всегда должны предоставлять обратную трассировку ошибок, но я подозреваю, что это происходит, когда вы проверяете «Плату за обучение».
3.Извините, я не знал стандартов Stackoverflow. Я запомню это. Обратная трассировка выглядит следующим образом:
File "marks.py", line 17, in <module> print(cell.offset(row=-1).value) File "/<the whoe path>/lib64/python3.6/site-packages/openpyxl/cell/cell.py", line 307, in offset
return self.parent.cell(column=offset_column, row=offset_row) File "/<the whole>/lib64/python3.6/site-packages/openpyxl/worksheet/worksheet.py", line 237, in cell
raise ValueError("Row or column values must be at least 1") ValueError: Row or column values must be at least 1
4. Таким образом, вы не можете смещать (строка =-1) из первой строки.
5. Хорошо, да, это имеет смысл. Но что меня удивляет, так это то, что это работает для большинства листов, но для некоторых это не удается. Я не понимаю, почему он может найти a
cell.offset(row=-1)
для некоторых листов, но не для других. Есть идеи, почему это может произойти?