当前位置: 首页 > news >正文

fastapi: 把数据表导出成excel电子表格文件

一,安装第三方库

$ pip install pandas

第二个库:

$ pip install openpyxl

二,代码

javascript

function get_selected_id() {// 1. 获取你的 form 元素 (假设 form 的 id 是 'myForm')const form = document.getElementById('myForm');console.log("form:", form)// 2. 找到该 form 下所有选中的 checkboxconst checkedBoxes = form.querySelectorAll('input[type="checkbox"][name="check-item"]:checked');console.log("checkedBoxes:", checkedBoxes)// 3. 将 NodeList 转换为数组,并提取 valueconst values = Array.from(checkedBoxes).map(checkbox => checkbox.value);console.log(values); // 输出类似: ["apple", "banana"]return values;
}//导出角色列表
function role_export(){var url = "{{ url_for('role_export') }}";var ids = get_selected_id();idstr = ''for(let i = 0; i < ids.length; i++) {console.log(ids[i]);if (idstr == '') {idstr = ids[i]} else {idstr = idstr+","+ids[i]}}var dest_url = url+"?ids="+idstrwindow.location.href = dest_url;
}

python:

# 做validator的form
class RoleExportForm(WTForm):#id = IntegerField('page', [validators.NumberRange(min=1)], default=0)# ,validators=[DataRequired()], min_entries=1ids = FieldList(IntegerField("ids",validators=[NumberRange(min=1,message="每个数字最小不能小于 1")]),min_entries=1)def validate_ids(self, field):# field.data 是一个列表,包含了所有提交上来的数据# 过滤掉 None 或空值,计算真正有效的条目数valid_entries = [v for v in field.data if v is not None]# 如果有效条目数小于 min_entries (这里是 1)if len(valid_entries) < 1:raise ValidationError("至少需要填写一项id!")  # 这里写你自定义的报错信息@router.get("/export",summary="角色数据导出")
async def role_export(request: Request,response: Response,db: AsyncSession = Depends(get_db)):# 得到参数get_data = request.query_paramsprint("get_data:", get_data)# form_data_dict = MultiDict()res = {}ids = []for key in get_data.keys():print("key:", key)# 用 .getlist(key) 把前端 append 的同名数组全部捞出来if key == 'ids':idsstr = get_data.get(key)idslist = idsstr.split(',')for value in idslist:print("value:", value)ids.append(int(value))res["ids"] = idsform = RoleExportForm(data=res)if form.validate() == False:error_str = get_error_message(form.errors)return ApiResponse.fail(response=response, code=400, status_code=400, message=error_str)# 查询数据raw_data = []for id in form.ids.data:print("id:", id)# 1. 查询用户是否存在stmt = select(Role).where(Role.id == id)result = await db.execute(stmt)role = result.scalars().first()if not role:continueraw_one = {'id': role.id,'name': role.name,}raw_data.append(raw_one)# 2. 将数据转为 Pandas 的 DataFrame,并映射表头为中文df = pd.DataFrame(raw_data)df.rename(columns={"id": "角色ID","name": "角色名字",}, inplace=True)# 3. 创建内存中的字节流对象(关键:避免写入服务器硬盘)buffer = io.BytesIO()# 4. 使用 ExcelWriter 将 DataFrame 写入这个内存 buffer# index=False 表示不需要把 Pandas 默认的 0,1,2 行索引导出去with pd.ExcelWriter(buffer, engine='openpyxl') as writer:df.to_excel(writer, index=False, sheet_name="员工薪酬表")# 5. 将指针移到 buffer 的起始位置,以便从头读取数据buffer.seek(0)# 6. 设置特殊的响应头,通知浏览器这是一个需要下载的文件附带文件名# 使用 URL 编码防止中文文件名变成乱码from urllib.parse import quotefilename = quote("角色数据表.xlsx")headers = {'Content-Disposition': f'attachment; filename="{filename}"; filename*=utf-8\'\'{filename}'}# 7. 通过 StreamingResponse 返回二进制流,指定 Excel 的 media_typereturn StreamingResponse(buffer,media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",headers=headers)

 

三,测试效果:

image

 

http://www.jsqmd.com/news/1316242/

相关文章:

  • Verilog仿真时间格式化:$timeformat系统任务详解与调试实践
  • TinySAM:如何在1/14计算成本下实现“分割一切“的轻量化革命?
  • AOE网络与关键路径算法:从理论到工程实践详解
  • 长时运行智能体工程实践:从Prompt到Harness的架构设计与实现
  • 深度解析PHP-Compiler:如何将PHP代码编译为原生机器码
  • Hidden Markov Model在Barefoot中的应用:揭秘地图匹配背后的概率模型
  • 深入解析CRC-16 CCITT:原理、实现与通信协议中的避坑指南
  • Matlab文件类型全解析:从.m到.mlx,掌握高效工作流
  • Pot跨平台翻译OCR工具:Tauri架构下的技术实现深度解析
  • yt-player实战案例:构建自定义YouTube播放器的完整步骤
  • 模糊自适应PID控制器设计:原理、实现与工程调试指南
  • 沈阳管道疏通上门怎么选?2026年8月沈阳主城区正规团队服务范围、收费行情与避坑指南 - 园子一号
  • Java Arrays.sort()自定义排序:从Comparator原理到Lambda与链式调用实战
  • 2026 避坑提醒|长岳正规车队商务车拼车电话.认准顺达商务出行 - 网点资讯
  • 课堂行为数据集:学生注意力与教学行为数据
  • ComfyUI-LTXVideo完整指南:如何在ComfyUI中轻松实现专业级AI视频生成
  • Bull装饰器完全指南:@Processor、@OnQueueEvent与依赖注入
  • 5分钟快速上手Plane:开源项目管理工具的终极指南
  • SAP ABAP长文本处理:SAVE_TEXT与READ_TEXT函数实战详解
  • 自定义协议解码器:为ESP32-Bit-Pirate添加私有协议支持
  • 旧棉被回收能卖钱吗?2026年旧衣服上门回收价格与避坑全攻略 - 快递物流资讯
  • FGO-py终极指南:全自动Fate/Grand Order助手完整教程
  • 公司员工心理测评工具怎么选?2026年主流平台横向评测 - 衡识人才测评
  • 2026中山太阳能草坪灯厂家哪家好?中山太阳能草坪灯厂家哪家靠谱一文解析 - 品牌深度评测
  • MRIcroGL:免费开源的医学影像三维可视化神器,5分钟上手教程
  • 终极Windows 11精简优化指南:如何让老旧电脑重获新生
  • 如何用QtScrcpy实现低延迟手机投屏与跨平台控制?
  • 从安装到使用:tumblr-utils完整操作指南
  • SAP ABAP长文本处理:SAVE_TEXT与READ_TEXT函数详解
  • 终极指南:如何用Norns打造你的开源音乐工作站