Openpyxl, Telegram. Выбор активного листа в цикле for
С помощью openpyxl получаю файл(читаю его). С помощью цикла получаю все наименования листов. Далее делаю команду, по которой вывожу данные из листа
import openpyxl
from aiogram import Router, F
from aiogram.types import Message
from aiogram.filters import Command, CommandStart
from keyboards import reply, inline
router = Router()
wb = openpyxl.reader.excel.load_workbook(filename = "data/Inventarization 2023.xlsx", data_only = True)
for item in wb.sheetnames:
sheet = wb[item]
@router.message((F.text == item))
async def agent (message: Message):
print(sheet)
text = ""
for i in range (11, 312):
text += f"? № {sheet['B' + str(i)].value}\n? Дата ввода: {sheet['C' + str(i)].value}\n✏️ Серийный номер: {sheet['D' + str(i)].value}\n? Инвентарный номер: {sheet['E' + str(i)].value}\n? Наименование: {sheet['F' + str(i)].value}\n? Кабинет: {sheet['G' + str(i)].value}\n? Примечание: {sheet['H' + str(i)].value}\n\n"
for x in range(0, len(text), 4096):
mess = text[x: x + 4096]
await message.answer(mess)
Есть 2 проблемы.
Выводит всегда только последний лист, я пробовал добавлять команду в цикл, всё равно также, только последний лист. (У меня их там 30)
Если даже получится вывести все листы помощью команды, то как сделать выбору строк? В данный момент у меня вывод строк идёт с 11 по 312, но не в каждом листе есть 312 строк.
for i in range (11, 312):
Ответы (1 шт):
Оказалось намного проще. openpyxl всё верно выдаёт и проходит цикл, но вот уже в aiogram есть нюанс.
sheet = wb[item]
Здесь в принципе почти всё верно, но вместо item нужно использовать метод от aiogram message.text.
sheet = wb[message.text]
Со вторым вопрос, есть метод у openpyxl max_row, можно использовать wb.max_row Либо же уже через sheet["A1:A+"], что означает по последней строке.