Home > OS >  How to return and download Excel file using FastAPI?
How to return and download Excel file using FastAPI?

Time:04-30

How do I return an excel file (version: Office365) using FastAPI? The documentation seems pretty straightforward. But, I don't know what media_type to use. Here's my code:

import os
from fastapi import FastAPI
from fastapi.responses import FileResponse
from pydantic import BaseModel
from typing import Optional

excel_file_path = r"C:\Users\some_path\the_excel_file.xlsx"

app = FastAPI()

class ExcelRequestInfo(BaseModel):
    client_id: str


@app.post("/post_for_excel_file/")
async def serve_excel(item: ExcelRequestInfo):
    # (Generate excel using item.)
    # For now, return a fixed excel.
    return FileResponse(
        path=excel_file_path,

        # Swagger UI says 'cannot render, look at console', but console shows nothing.
        media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'

        # Swagger renders funny chars with this argument:
        # 'application/vnd.ms-excel'
    )

Assuming I get it right, how to download the file? Can I use Swagger UI (OpenAPI docs) generated by FastAPI to view the sheet? Or, curl? Ideally, I'd like to be able to download and view the file in Excel.

CodePudding user response:

You could set the Content-Disposition header using the attachment parameter, indicating to the browser that the file should be downloaded, as described in the answers here and here. Swagger UI will provide a Download file link for you to download the file, as soon as you execute the request.

headers = {'Content-Disposition': 'attachment; filename="Book.xlsx"'}
return FileResponse(excel_file_path, headers=headers)

To have the file viewed in the browser, one can use the inline parameter in the Content-Disposition header. However, one should set the correct media_type in the FileResponse (for Excel files see here), as well as .xlsx (or .xls) must be a known file extension to the browser.

  • Related