Задать вопрос

Как используя BytesIO создать эксель файл и отправить его клиенту через FastAPI?

Не совсем понимаю как правильно переписать код так, чтобы генерировался эксель на "лету" и отправлялся клиенту через фастапи. Пока что генерирую эксель сохраняя физически, мне это не нужно, вот мой код по генерации эксель используя библиотеку openpyxl:
def create_xl(append_data):
    one_list = 0
    wb = Workbook()
    with NamedTemporaryFile(delete=True) as tmp:
        tmp.close()
        wb2 = wb.active
        add_first_column(wb2)
        while one_list < len(append_data):
            for index in cells:
                
                number = 2
                for elem in append_data[one_list]:
                    wb2[f'{index}{number}'] = elem
                    number += 1
                one_list += 1
        wb.save(tmp.name)

    return tmp.name


А вот код, где отправляю клиенту этот файл через фастапи:
def historydatapnils(pnils = Form()):
    append_data_fio = history_pnils(pnils)

    strams = create_xl(append_data_fio)

    return FileResponse(strams, 
                        filename=f'{pnils}.xlsx', 
                        media_type="application/octet-stream")

Понимаю, что скорее всего надо использовать StreamingResponse при отправке сгенерированного на лету экселя, но вот вообще не получалось никак его таким образом сгенерировать, подскажите пожалуйста, как это можно реализовать?
  • Вопрос задан
  • 407 просмотров
Подписаться 3 Средний 1 комментарий
Решения вопроса 1
AshBlade
@AshBlade
Просто хочу быть счастливым
1. В ответе нужно указать Content-Disposition заголовок с названием файла
2. Возвращаешь StreamingResponse в который передаешь bytes

Т.е. тебе не нужно создавать временный файл (который ты ай-ай-ай не удаляешь после отправки)

StackOverflow с конкректным примером
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы