Да, для отправки файла Excel напрямую клиенту через FastAPI, можно использовать StreamingResponse вместо FileResponse. Вместо создания временного файла на диске, вы можете использовать BytesIO для генерации файла Excel в памяти и передавать его содержимое напрямую в Response.
Вот пример, как можно изменить ваш код для достижения этой цели:
```python
from io import BytesIO
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from openpyxl import Workbook
app = FastAPI()
def create_xl(append_data):
wb = Workbook()
wb2 = wb.active
add_first_column(wb2)
for index in cells:
number = 2
for elem in append_data:
wb2[f'{index}{number}'] = elem
number += 1
output = BytesIO()
wb.save(output)
output.seek(0)
return output
@app.get("/download")
def download_excel():
append_data_fio = history_pnils(snils)
stream = create_xl(append_data_fio)
return StreamingResponse(stream, media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", headers={
"Content-Disposition": "attachment; filename=example.xlsx"
})
```
Здесь мы создали функцию `create_xl`, которая генерирует файл Excel и сохраняет его содержимое в BytesIO объект в памяти. Затем в обработчике `/download` используем StreamingResponse для передачи содержимого файла клиенту без сохранения его на диск.
Обратите внимание, что `media_type` установлен на `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` для указания правильного типа контента файла Excel. Если требуется поддержка старых форматов Excel (например, .xls), замените его соответствующим типом.
Таким образом, клиент при обращении к `/download` будет получать файл Excel для загрузки.