【Python】Fastapi 使用 Pandas 实现导出 Excel

【Python】Fastapi 使用 Pandas 实现导出 Excel

除了 pandas ,使用 xlsxwriter或openpyxl 应该也可以,基本相同.

笔记 备忘 便于 后续查阅使用

背景

在使用 Fastapi ,且使用到了大量 pandas 时,遇到浏览器导出Excel的需求时.

使用场景

  1. 导出待导入模板.
  2. 导出报表
  3. 导出明细 等…

一 . 提取的利于复用的方式

思路

  1. 提取 为公共方法到 公共方法中.
  2. 便于 多个接口中 复用.

示例代码

from fastapi import APIRouter
from fastapi.responses import StreamingResponse
import pandas as pd
import io

router = APIRouter(prefix="/api/导入")

def df_downxlsx(df: pd.DataFrame, filename: str = 'out.xlsx') -> StreamingResponse:
    # 创建 IO buffer
    buffer = io.BytesIO()
    # 将df写入buffer
    df.to_excel(buffer, index=False)
    buffer.seek(0)
    excel_bytes = buffer.getvalue()
    headers = {
        "Content-Disposition": f"attachment; filename={filename}".encode("utf-8").decode("latin1")}
    media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    return StreamingResponse(io.BytesIO(excel_bytes), media_type=media_type, headers=headers)


@router.get("/down_template", tags=['导入'], name="下载导入模板")
async def api_down_template(template: str):
    # 表头字段
    columns = ['姓名', '学号', '班级']
    # 表格内容,模板时:可以为空,或表格内容. 其他表格时正常内容即可.
    # data = []
    data = [{'姓名': 'xx', '学号': 'xx', '班级': 'xx'}]
    # 创建 DataFrame
    df = pd.DataFrame(data, columns=columns)
    filename = '导入模板.xlsx'
    return df_downxlsx(df, filename)

二 . 单个简单接口的方式

以导出 导入模板 为例

有时在 上传页面,会有导入的需求,但导入的模板 通常会和使用方协商好,避免操作者 导入的表格不规范,通常会 提供下载模板的方式 规范上传的表格.

示例代码

from fastapi import APIRouter
from fastapi.responses import StreamingResponse
import pandas as pd
import io

router = APIRouter(prefix="/api/导入")

@router.get("/down_template", tags=['导入'], name="下载导入模板")
async def down_template(template: str):

    # 表头字段
    columns = ['姓名', '学号', '班级']
    # 表格内容,模板时:可以为空,或表格内容. 其他表格时正常内容即可.
    # data = []
    data = [{'姓名': 'xx', '学号': 'xx', '班级': 'xx'}]
    # 创建 DataFrame
    df = pd.DataFrame(data, columns=columns)
    # 创建 IO buffer
    buffer = io.BytesIO()
    # 将df写入buffer
    df.to_excel(buffer, index=False)
    buffer.seek(0)
    excel_bytes = buffer.getvalue()
    filename = '导入模板.xlsx'
    headers = {
        "Content-Disposition": f"attachment; filename={filename}".encode("utf-8").decode("latin1")}
    media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    return StreamingResponse(io.BytesIO(excel_bytes), media_type=media_type, headers=headers)

三. TODO 单文件 可直接测试的文件

# TODO 单文件 可直接测试的文件

其他参考:

  1. 【Python】fastapi实现后端导出Excel

路漫漫其修远兮,吾将上下而求索.

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值