【fastapi】以流模式生成并返回电子表格(不占用存储)

最近一直在用FastApi开发Web系统,经常需要遇到数据导出的需求。
分享一个我自己使用的导出函数。
优点
1.以数据流生成并返回给前端下载,不占用服务器存储。
2.可以自定义表头和数据样式
代码里的注释都标记完整了,可以直接使用。

import xlwt
from io import BytesIO
from urllib.parse import quote
from fastapi.responses import StreamingResponsedef export_exl(header, data=None, data_col=None, file_name='download', need_order=False):"""以流的形式导出到excel:param header: ['列名1', '列名2']:param data: [{'a': 1, 'b': 2}]			数据集,与header、data_col对应:param data_col: ['与列名对应的字段1', '与列名对应的字段2']:param file_name: 文件名称:param need_order: 是否插入序号:return:"""def set_style():"""设置样式:return:"""# 居中设置alignment = xlwt.Alignment()alignment.horz = xlwt.Alignment.HORZ_CENTERalignment.vert = xlwt.Alignment.VERT_CENTERalignment.wrap=1 #设置自动换行# 设置表头字体样式head_style = xlwt.XFStyle()font = xlwt.Font()font.name = 'Times New Roman'   # 字体font.height = 20 * 16           #字体大小font.bold = True                # 字体加粗font.colour_index=9             #字体颜色# 设置背景颜色pattern = xlwt.Pattern()# 设置背景颜色的模式pattern.pattern = xlwt.Pattern.SOLID_PATTERN# 背景颜色pattern.pattern_fore_colour = 40head_style.pattern=patternhead_style.font = font              # 设置字体head_style.alignment = alignment    # Add Alignment to Style# 设置表中内容样式cont_style = xlwt.XFStyle()font = xlwt.Font()font.name = 'Times New Roman'   # 字体font.bold = False               # 字体加粗cont_style.font = font              # 设置字体cont_style.alignment = alignment    # Add Alignment to Style# 设置单元格边界borders = xlwt.Borders()borders.left = xlwt.Borders.THINborders.right = xlwt.Borders.THINborders.top = xlwt.Borders.THINborders.bottom = xlwt.Borders.THINhead_style.borders = borderscont_style.borders = bordersreturn head_style, cont_styledef get_sheet(_book, _index):"""创建sheet页:param _book::param _index::return:"""_name = "sheet_{}".format(str(_index))_sheet = _book.add_sheet(_name)return _sheetdef write_head(_head, _sheet, _head_style):"""写入表头:param _head::param _sheet::param _head_style::return:"""for head in range(len(header)):context = str(header[head])# need_width = (1 + len(context)) * 256need_width = 20 * 256table_sheet.col(head).width = need_widthtable_sheet.write(0, head, context, style=_head_style)# 是否插入序号if need_order:header.insert(0, '序号')sheet_index = 1book = xlwt.Workbook(encoding='utf-8')          # 创建 Excel 文件table_sheet = get_sheet(book, sheet_index)      # 添加sheet表h_style, c_style = set_style()write_head(header, table_sheet, h_style)if data and data_col:# 插入数据row = 1for item in data:if need_order:table_sheet.write(row, 0, row, style=c_style)  # 写入序号for col in range(len(header[1:])):table_sheet.write(row, col+1, str(item.get(data_col[col], '-') if item.get(data_col[col]) else '-'), style=c_style)else:for col in range(len(header)):table_sheet.write(row, col, str(item.get(data_col[col], '-') if item.get(data_col[col]) else '-'), style=c_style)row += 1if row > 50000:  # 单表数量超过 65535 条 添加新的表row = 1sheet_index += 1table_sheet = get_sheet(book, sheet_index)  # 添加sheet表write_head(header, table_sheet, h_style)# print(help(table_sheet))# table_sheet.data_validation("A1", {'validate': 'list', 'source': [1, 2, 3, 4]})sio = BytesIO()     # 返回文件流到浏览端下载,浏览端必须以form提交方式方能下载成功!book.save(sio)      # 这点很重要,传给save函数的不是保存文件名,而是一个StringIO流sio.seek(0)         # 保存流# 组装headerheaders = {"content-type": "application/vnd.ms-excel","content-disposition": f'attachment;filename={quote(file_name,"utf8")}.xlsx'}# 以流的形式返回浏览器return StreamingResponse(sio, media_type='xls/xlsx', headers=headers)

【注意】安装依赖:

pip install fastapi[all] xlwt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/23787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础打靶—Glasgow Smile靶场

一、打靶的主要五大步骤 1.确定目标:在所有的靶场中,确定目标就是使用nmap进行ip扫描,确定ip即为目标,其他实战中确定目标的方式包括nmap进行扫描,但不局限于这个nmap。 2.常见的信息收集:比如平常挖洞使用…

无人机反制软硬手段

无人机反制方式——软杀伤 (1)信号干扰。目前,对无人机的控制多使用无线电通信技术,通过向目标无人机发射大功率干扰信号,对控制信号进行压制,对于现代电子干扰技术来说,干扰频率覆盖几十兆赫…

预测预测---通过KIMI来预测上海高考语文题目

一、历史上海语文高考题目 2022年:提问与结论。小时候人们喜欢发问,长大后往往看重结论。对此,有人感到担忧,有人觉得正常,你有怎样的思考? 2021年:沉淀与价值。有人说,经过时间的沉…

1.音视频开篇

目录 音视频播放的原理 音视频数据格式YUV YUV数据存储比 ​编辑 YUV空间格式 RGB与YUV转换 音视频播放的原理 主要分为:解协议->解封装->解码->音视频同步->播放。当然,如果是本地播放,没有解协议这一步骤。 采集数据其实…

【大事件】docker可能无法使用了

今天本想继续学习docker的命令,突然发现官方网站的文档页面打不开了。 难道是被墙了? 我用同事的翻了一下,能进,果然! 正好手头的工作告一段落,将代码上传,然后通过jenkins将服务器自动部署到…

华硕NUC 14 Pro+ :科技与艺术相得益彰

什么样的迷你主机可以称之为“艺术品”?让我们一起认识NUC 14 Pro,看科技与艺术可以交汇出怎样的独特韵味? 科技与美学的邂逅 华硕NUC 14 Pro不仅是一台性能强劲的电脑主机,更像是一件可以在桌面“展出”的艺术品。精致小巧的体积…

HTML 总结

HTML 简介 HTML(HyperText MarkupLanguage): 超文本标记语言 超文本 : 普通文本指的是只有文字没有图片 ,视频, 音乐,而超文本就有 标记语言 : 由标签构成的语言 HTML的标签都是预定好的, 如<a> </a> 为超链接 HTML代码直接在浏览器中运行,由浏览器内核进行解…

UART串口通信要点和难点具体应用案例

UART(Universal Asynchronous Receiver/Transmitter)串口通信是一种广泛使用的异步串行通信协议,它允许在微控制器、计算机和其他设备之间进行数据交换。以下是关于UART串口通信的清晰回答,涵盖了其定义、工作原理、数据格式和传输速率等方面的内容。 定义 UART(通用异步…

构建自动化API数据抓取系统

构建一个自动化API数据抓取系统是一个涉及多个技术领域的复杂任务。这样的系统不仅要求高效的数据获取能力&#xff0c;还需要有稳定的数据处理、存储和错误处理机制。 1. 需求分析 在开始构建之前&#xff0c;明确你的需求至关重要。你需要确定要抓取的API、数据的频率、数据的…

7.高级纹理

前面的基础纹理包括法线纹理、渐变纹理和遮罩纹理等。这些纹理都属于低纬&#xff08;一维或二维&#xff09;纹理。 立方体纹理&#xff08;Cubemap&#xff09;实现环境映射 渲染纹理&#xff08;Render Texture&#xff09; 程序纹理&#xff08;Procedure Texture&#…

理解 Vue 中的响应式系统

Vue.js 是一个渐进式 JavaScript 框架&#xff0c;以其简单易用和灵活性著称。其核心之一是响应式系统&#xff0c;使得数据的变化能够自动更新视图。然而&#xff0c;初学者经常会对其工作机制感到困惑&#xff0c;特别是在处理对象或数组时。 响应式系统简介 Vue 的响应式系…

计算机毕业设计 | 基于node(Koa)+vue 高校宿舍管理系统 宿舍可视化(附源码)

1&#xff0c;绪论 1.1 项目背景 随着科技的发展&#xff0c;智能化管理越来越重要。大学生在宿舍的时间超过了1/3&#xff0c;因此良好的宿舍管理对学生的生活和学习极为关键。学生宿舍管理系统能够合理安排新生分配宿舍&#xff0c;不浪费公共资源&#xff0c;减轻学校管理…

浅析人工智能技术在网络安全领域中的应用

文 | 绿盟科技集团股份有限公司 顾杜娟 杨鑫宜 王星凯 刘文懋 叶晓虎 企业数字化转型浪潮的来临促使人工智能技术得到了企业的普遍关注和重视。人工智能技术发展至今已经广泛应用到图像识别、自然语言处理等领域&#xff0c;并取得了重大的突破。随着网络空间逐渐成为数字经济…

【linux】(5)head和tail

head head 用于显示文件的前几行。 基本用法 head [OPTION]... [FILE]...常用选项 显示文件的前 N 行 head -n N filename例子&#xff1a;显示文件 filename 的前 10 行&#xff08;默认&#xff09;。 head filename例子&#xff1a;显示文件 filename 的前 5 行。 he…

零售行业运营有哪些业务场景?详解各业务场景的分析指标和维度

在当今这个数字化迅速发展的时代&#xff0c;零售行业正经历着前所未有的变革。传统的零售模式正在被新兴的技术和创新的业务场景所颠覆&#xff0c;消费者的需求和购物习惯也在不断地演变。零售行业的运营&#xff0c;作为连接消费者、产品和市场的关键环节&#xff0c;对于零…

头歌初识redis答案

头歌初识Redis的答案可以从多个方面进行归纳和总结。以下是根据参考文章提供的信息&#xff0c;按照清晰、分点表示和归纳的方式给出的答案&#xff1a; 一、Redis基础知识 Redis有16个数据库&#xff0c;默认使用第0个数据库&#xff0c;可以用select命令进行切换。 Redis是…

五八 领岳科技面经 2024.06.06

五八面经 1、多线程打印有多少种实现方式&#xff1f; 2、ReentrantLock中的公平锁是怎么实现的&#xff1f; 3、Redis用在什么场景下&#xff1f;分布式锁怎么设置&#xff1f;如何解锁&#xff1f;如果想要续锁应该怎么做&#xff1f; 4、redis单线程怎么支持10w qps的并…

webpack 预加载资源

1 效果图对比 preload.js就是我们预加载的资源 1.1什么情况下使用预加载 比如&#xff1a;是用户点击按钮时才加载这个资源的&#xff0c;如果资源体积很大&#xff0c;那么用户会感觉到明显卡顿效果 要优化这种情况&#xff0c;可以使用preload和prefetch技术 1.2 2.什么是…

【Python Cookbook】S01E24 如何定义正则表达式模式从而准确匹配内容,通过 ? 调整贪心策略为非贪婪

目录 问题解决方案讨论 问题 如果使用正则化表达式&#xff0c;或者说如何通过准确定义正则化表达式的模式从而对字符串内容做准确的匹配&#xff1f; 解决方案 例如&#xff0c;在下述案例中&#xff0c;如何匹配出字符串文本 text_1 中双引号扩起的内容。 import repatte…

Navicat修改数据库主键

在MySQL数据库&#xff0c;主键ID默认自增&#xff08;最大的数字自增&#xff09;&#xff0c;但是&#xff0c;在某些情况下&#xff0c;我们想将其从头开始………… 借助Navicat修改数据库主键即可&#xff01; 1. 找到数据库&#xff0c;点击需要更改的表&#xff1a;点击…