mongodb 导出txt_(干货)前端实现导出excel的功能

d2fcd30de22727cca1d4d3bfde913234.png

前言

导出功能其实在开发过程中是很常见的,平时我们做导出功能的时候基本都是后台生成,我们直接只需要调一支接口后台把生成的文件放到服务器或者数据库mongodb中,如果是放到mongodb中的话,我们需要从mongodb中通过唯一生成的id去拿到文件,最后window.location.href就完事了。如果是放到服务器上,直接从服务器上下载就好了。下面我们使用另一种 H5 的新特性blob[1]对象来实现一下导出功能。

什么是 Blob

Blob() 构造函数返回一个新的 Blob 对象。 blob 的内容由参数数组中给出的值的串联组成。

var aBlob = new Blob( array, options );
  • 兼容性

dae2d3e24b962fb0f8e9090fcfc6a713.png

mimeType[2]

在 Blob 的构造函数中options参数的接受一个参数type,这个参数代表的是媒体类型,告诉浏览器是什么类型的文件,常见的有

{".3gp",    "video/3gpp"},
{".apk",    "application/vnd.android.package-archive"},
{".asf",    "video/x-ms-asf"},
{".avi",    "video/x-msvideo"},
{".bin",    "application/octet-stream"},
{".bmp",    "image/bmp"},
{".c",  "text/plain"},
{".class",  "application/octet-stream"},
{".conf",   "text/plain"},
{".cpp",    "text/plain"},
{".doc",    "application/msword"},
{".docx",   "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
{".xls",    "application/vnd.ms-excel"},
{".xlsx",   "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
{".exe",    "application/octet-stream"},
{".gif",    "image/gif"},
{".gtar",   "application/x-gtar"},
{".gz", "application/x-gzip"},
{".h",  "text/plain"},
{".htm",    "text/html"},
{".html",   "text/html"},
{".jar",    "application/java-archive"},
{".java",   "text/plain"},
{".jpeg",   "image/jpeg"},
{".jpg",    "image/jpeg"},
{".js", "application/x-javascript"},
{".log",    "text/plain"},
{".m3u",    "audio/x-mpegurl"},
{".m4a",    "audio/mp4a-latm"},
{".m4b",    "audio/mp4a-latm"},
{".m4p",    "audio/mp4a-latm"},
{".m4u",    "video/vnd.mpegurl"},
{".m4v",    "video/x-m4v"},
{".mov",    "video/quicktime"},
{".mp2",    "audio/x-mpeg"},
{".mp3",    "audio/x-mpeg"},
{".mp4",    "video/mp4"},
{".mpc",    "application/vnd.mpohun.certificate"},
{".mpe",    "video/mpeg"},
{".mpeg",   "video/mpeg"},
{".mpg",    "video/mpeg"},
{".mpg4",   "video/mp4"},
{".mpga",   "audio/mpeg"},
{".msg",    "application/vnd.ms-outlook"},
{".ogg",    "audio/ogg"},
{".pdf",    "application/pdf"},
{".png",    "image/png"},
{".pps",    "application/vnd.ms-powerpoint"},
{".ppt",    "application/vnd.ms-powerpoint"},
{".pptx",   "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
{".prop",   "text/plain"},
{".rc", "text/plain"},
{".rmvb",   "audio/x-pn-realaudio"},
{".rtf",    "application/rtf"},
{".sh", "text/plain"},
{".tar",    "application/x-tar"},
{".tgz",    "application/x-compressed"},
{".txt",    "text/plain"},
{".wav",    "audio/x-wav"},
{".wma",    "audio/x-ms-wma"},
{".wmv",    "audio/x-ms-wmv"},
{".wps",    "application/vnd.ms-works"},
{".xml",    "text/plain"},
{".z",  "application/x-compress"},
{".zip",    "application/x-zip-compressed"},
{"",        "*/*"}

导出

我们需要调取接口来获取导出文件的内容,如果我们先后端分离的话,我们需要接口给我们返回Buffer, Blob, DOMString类型的数据,DOMStrings会被编码为UTF-8。

let blob = new Blob([接口返回的数据], {type: "application/vnd.ms-excel;charset=utf-8"
});

使用a标签,模拟点击a标签完成导出功能,通过URL.createObjectURL()[3]方法创建一个下载的链接地址,最后在不需要的时候URL.revokeObjectURL释放掉

let downloadElement = document.createElement("a");
let href = window.URL.createObjectURL(blob); //创建下载的链接
downloadElement.href = href;
document.body.appendChild(downloadElement);
downloadElement.click(); //点击下载
document.body.removeChild(downloadElement); //下载完成移除元素
window.URL.revokeObjectURL(href); //释放掉blob对象

文件名的设置

文件名称通过报文头设置content-disposition属性设置,Content-Disposition参数:

attachment --- 作为附件下载   
inline --- 在线打开
setHeader("Content-Disposition","inline; filename=文件名.mp3");
setHeader("Content-Disposition","attachment;filename=test.xls");

前端通过截取报文头里的content-disposition字段获取文件名称:

downloadElement.download =decodeURI(res.headers["content-disposition"].split("filename=")[1]
) || ""; //下载后文件名

完整代码

这里的res代表后台返回的数据:

config: {url: "/ExportExcel", method: "post", data: "", headers: {…}, baseURL: "/api/", …}
data: Blob {size: 5120, type: "application/vnd.ms-excel"}
headers: {connection: "close", content-disposition: "attachment;filename=xxx.xls", content-encoding: "gzip", content-length: "1455", content-type: "application/vnd.ms-excel;charset=UTF-8", …}
request: XMLHttpRequest {readyState: 4, timeout: 30000, withCredentials: false, upload: XMLHttpRequestUpload, onreadystatechange: ƒ, …}
status: 200
statusText: "OK"

前端代码

let blob = new Blob([res.data], {type: "application/vnd.ms-excel;charset=utf-8"
});
let downloadElement = document.createElement("a");
let href = window.URL.createObjectURL(blob); //创建下载的链接
downloadElement.href = href;
downloadElement.download =
decodeURI(res.headers["content-disposition"].split("filename=")[1]
) || ""; //下载后文件名
document.body.appendChild(downloadElement);
downloadElement.click(); //点击下载
document.body.removeChild(downloadElement); //下载完成移除元素
window.URL.revokeObjectURL(href); //释放掉blob对象

写在最后

导出功能多种多样,根据浏览器的不同和需求的不同会有不同的问题出现其中的坑还是比较多的,适合自己需求的才是最好的。

参考资料

[1] Blob: https://developer.mozilla.org/zh-CN/docs/Web/API/Blob/Blob

[2] mimeType: https://blog.csdn.net/weixin_33734979/article/details/84582017

[3] createObjectURL: https://developer.mozilla.org/zh-CN/docs/Web/API/URL/createObjectURL

❤️ 爱心三连击

1.如果觉得这篇文章还不错,来个分享、点赞、在看三连吧,让更多的人也看到~

2.关注公众号小丑的小屋,定期为你推送好文和总结,一起学习一起进步。

3.有什么问题和有错误的地方,欢迎大家的留言和评论,还有后续更新,下期更加精彩

cd4ee545c894cd3624d710191ef42cff.png

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

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

相关文章

1971旗舰cpu intel_CPU的历史

很多人都对电脑硬件有一点的了解,本人也算略懂一二,所以今天来为大家说说电脑的主要硬件之一––CPU(中央处理器)。那么我们知道世界上造CPU的公司主要就是Intel和AMD。其实仔细想想,CPU的主要成分是什么?是硅(Si),硅从那里来&am…

文本显示变量_【RPA课堂】UiPath中的变量、数据类型和组件

自动化出现的那一天起,就有了各种各样的工具来满足自动化的需要。无论是用于windows桌面自动化的简单工具,还是用于企业自动化大量任务的工具,它们都有自己的功能。UiPath就是这样的工具,在本文中,我们介绍一些非常基本…

linux挂载cifs磁盘_CentOS7.4_1708挂载CIFS报错

CentOS7.41708操作系统,Windows_Server2012做1TB的网络共享磁盘(没有域)。今天在项目做软件加密的部署,现场环境是Vsphere虚拟化需要用CIFS共享来传输文件、软件等。CRT、Putty等工具的传输工具无法传输字符集!CentOS操作系统终端界面无任务信…

bootstrap上传图片可实现查看上一张图片和下一张图片_如何实现像人民日报微信推文一样的的点亮效果?...

如何实现向人民日报微信推文一样的的点亮效果?有两种方法:方法一:就是使用代码在编辑器进行编辑emmmmmm这个方法贼麻烦,需要调至HTML模式……方法二:在现有编辑器模板下利用SVG动画进行编辑,因为点亮效果本…

python加载项向导_Python安装与环境变量的配置,Python安装向导

我下载的是Python2.7.17Python安装包下载地址:https://www.python.org/downloads/release/python-2717/根据实际的操作系统,安装合适的安装版本Python安装:1.双击下载包,进入Python安装向导。2.选择安装目录。博主安装目录为 D:…

python 单例模式 redis_python 单例模式实现多线程共享连接池

我们经常使用数据库连接池,但那是有时候有些库并没有实现线程安全的连接池,这个时候,该如何自己封装?多进程和多线程甚至协程模式下,如何控制数据库连接数量或者是socket连接数。这个问题很有意义。

python中的return和print的区别_python中return和print的区别(详细)

Huskiesir python最近正在研究。今天,我面临一个问题,那就是,返回和印刷的区别。双方都能输出结果。的区别是什么?闲话少说,看下面的例子。# Code1: def break_words(东西):\u201C这个函数将为我们分手的话。\u201D\u201C单词()返回#输入字符串,输出生成切片列表句 \话说(\u20…

mvc 怎么把后台拼接好的div写到前台_MVC 从后台页面 取前台页面传递过来的值的几种取法...

<1>前台页面 Index视图注意&#xff1a;用户名表单的name值为txtName密码表单的name值为txtPasswordTest用户名密 码<2>后台页面&#xff0c;Home控制器 (为了测试&#xff0c;分别将视图页中的from表单的action设为 action"/Home/Test" &#xff0c;act…

ear的英语怎么念_ear英语怎么读

展开全部英式读法 [ɪə(r)] 。美式读法[ɪr] 。作名词意思是听觉&#xff1b;耳朵&#xff1b;倾听。麦穗。作动词意思是抽穗32313133353236313431303231363533e59b9ee7ad9431333431336661。形容词是earless。过去式是eared。过去分词是eared。现在分词是earing。第三人称单数…

设置log缓存_node多级缓存之redis缓存

在node项目开发过程中&#xff0c;缓存常常被用来解决高性能、高并发等问题。在我们的实际项目中&#xff0c;运用缓存的思路是内存缓存-->接口-->文件缓存。前面的总结中已经详细的说明了怎么实现和封装内存缓存和文件缓存。虽然二级缓存已经基本能够满足现在的所有场景…

gazebo 直接获取传感器数据_【ROS-Gazebo】IMU插件使用与数据采集——以四足机器人pigot为例...

最近在琢磨别的事情&#xff0c;Gazebo探索上面进展不大&#xff0c;但也有一些收获&#xff0c;秉承慢慢写的佛系态度记录一下&#xff1a;pigot四足项目的步态改进&#xff0c;前行换成了摆线步态&#xff0c;加入了斜向步态Gazebo-IMU(惯性测量单元)插件的用法利用rqt_plot绘…

c++实现决策树分类汽车评估数据集_R有监督机器学习-分类方法

当我们说机器学习的的时候&#xff0c;我们在说什么&#xff1f;来源于mlr3包的作者&#xff1a;https://mlr3book.mlr-org.com/basics.html上图解释了完整的机器学习流程&#xff0c;包括构建任务、准备训练数据集及测试数据集、选择学习方法&#xff08;leaner&#xff09;、…

lingo编程的主要方法_java并发编程 --并发问题的根源及主要解决方法

并发问题的根源在哪首先&#xff0c;我们要知道并发要解决的是什么问题&#xff1f;并发要解决的是单进程情况下硬件资源无法充分利用的问题。而造成这一问题的主要原因是CPU-内存-磁盘三者之间速度差异实在太大。如果将CPU的速度比作火箭的速度&#xff0c;那么内存的速度就像…

bootstrap框架过时了吗_为何前端都不愿意用bootstrap框架

Bootstrap框架属于UI框架&#xff0c;这个和jQuery不太一样&#xff0c;其实准确的描述Bootstrap框架属于css框架而非javascript框架&#xff0c;但是它本身也使用javascript来完善Bootstrap框架的视觉效果。此外&#xff0c;Bootstrap框架十分超前&#xff0c;在支持html5和cs…

go语言mysql框架_超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务...

前言本文通过一步一步的设计&#xff0c;最终实现一个完善的todo应用。我们使用GO框架Gin用户路由控制和返回数据。使用Gorm用于操作数据库。读者可根据本教程操作&#xff0c;最终实现列出的各项功能。技术清单本文中所涉及的技术内容主要有以下几种&#xff1a;Gin&#xff1…

ef mysql 外键 一对一_MySQL 外键 一对一 一对多 多对多 复制

#外键## 1,学习外键首先要明白表与表之间的关系​ 首先要换位思考 在考虑了这边 还要考虑另一边​ 然后在下定论### 判断表关系的语法#### 图书与出版社​ 一本书可不可以有多个出版社 不可以​ 一个出版社可不可以出版多本书 可以​ 这就是一对多关系#### 图书与作者​ 一本书…

Mysql中Drop删除用户的名字_mysql5.5 使用drop删除用户

在说这个问题之前我们先讨论下关于在mysql中删除用户的方法和问题&#xff1a;其实在以前我删除mysql中的账号的时候用delete&#xff0c;一直没注意其实用这个命令删除账号会有一个问题就是使用delete删除账号后&#xff0c;只会清除user表的&#xff0c;在其它表中的信息还是…

docker建多个mysql_《容器化系列二》利用Docker容器化技术安装多个mysql

前提说明安装的Linux系统版本为Centos7.x一、安装docker并测试1、安装yum相关工具包///安装yum相关工具包yum install -y yum-utils device-mapper-persistent-data lvm2//发些报错&#xff0c;关闭刚刚睡眠中的进程kill -9 13312//再次执行yum install -y yum-utils device-ma…

mysql 元数据获取_[MySQL] 获取元数据的步骤

[MySQL] 获取元数据的方法 MySQL提供了以下三种方法用于获取数据库对象的元数据&#xff1a; 1)show语句 2)从INFORMATION_SCHEMA数据库里查询相关表 3)命令行程序&#xff0c;如mysqlshow, mysqldump 用SHOW语句获取元数据 MySQL用show语句获取元数据是最常用的方法&#xff0…

ai如何置入_ai图片(ai怎么把图片嵌入到图形里)

怎样将Ai格式的图片转换成常用的jpg&#xff0c;用什么软件转换&#xff1f;ai后缀的图片是指通过Illustrator(简称ai )软件储存得到的图片格式 这种格式的图片是矢量的&#xff0c;也就是说像freehand,Coredraw那样子的图片可以随意放大但不失真的那种 .在AI中&#xff0c;插入…