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

Как отправить временный эксель файл напрямую из оперативной памяти без физического сохранения, используя BytesIO?
Изображение к вопросу
Изображение к вопросу
  • 13 октября 2023 г. 11:40
Ответы на вопрос 1
Для создания файла Excel с использованием BytesIO в FastAPI вы можете воспользоваться модулем `openpyxl`. Вот пример кода, который создает файл Excel, сохраняет его в объекте BytesIO и отправляет его клиенту:

```python
from fastapi import FastAPI, Response
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
import io

app = FastAPI()

@app.get("/download_excel")
async def download_excel():
    # Создание экземпляра рабочей книги
    workbook = Workbook()
    sheet = workbook.active
    
    # Добавление данных в лист
    sheet.append(["Header 1", "Header 2", "Header 3"])
    sheet.append(["Data 1", "Data 2", "Data 3"])
    
    # Сохранение рабочей книги в объекте BytesIO
    excel_file = io.BytesIO()
    workbook.save(excel_file)
    excel_file.seek(0)  # Установка указателя на начало файла 
    
    # Отправка файла клиенту
    headers = {
        "Content-Disposition": "attachment; filename=example.xlsx",
        "Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    }
    return Response(content=excel_file, headers=headers)
```

В комментарии выше есть пояснения к каждому этапу. Функция `download_excel()` создает экземпляр рабочей книги, добавляет данные в лист, сохраняет рабочую книгу в объекте BytesIO, а затем отправляет его клиенту с помощью `Response(content=excel_file, headers=headers)`.

Теперь, когда вы перейдете по адресу `/download_excel` в вашем FastAPI-приложении, он создаст Excel-файл и отправит его клиенту в виде скачиваемого файла. 

Обратите внимание, что файл Excel сохраняется в формате `.xlsx` и используются соответствующие заголовки `Content-Disposition` и `Content-Type` для передачи файла клиенту.
Похожие вопросы