Vue通过Blob对象实现导出Excel功能示例代码


Posted in Javascript onJuly 31, 2020

不同的项目有不同的导出需求,有些只导出当前所显示结果页面的表格进入excel,这个时候就有很多插件,比如vue-json-excel或者是Blob.js+Export2Excel.js来实现导出Excel功能。但是有些需求因为数据量太大,成千上万条数据,所以是需要后端拼接,然后输出二进制流文件,然后前端直接下载,这次我们谈谈后者的做法。

Blob对象表示一个不可变、原始数据的类文件对象,通常我也叫它二进制流对象。我们可以通过Blob对象实现导出Excel功能,先放上代码:

<el-button @click="exportExcel()">导出</el-button>

<script>
methods: {
 exportExcel(){
  var params={
  XX:xx//额外需要携带的请求体
  }
  this.$axios.get('/XX/XX',{
  params: params,
  responseType: 'blob' //首先设置responseType字段格式为 blob
  }).then(res => {
  console.log(res);
  let blob = new Blob([res], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"}); // 为blob设置文件类型,这里以.xlsx为例
  let url = window.URL.createObjectURL(blob); // 创建一个临时的url指向blob对象
  let a = document.createElement("a");
  a.href = url;
  a.click();
  // 释放这个临时的对象url
  window.URL.revokeObjectURL(url); 
  });
 },
 }
</script>

'responseType'表示的是服务器响应的数据类型,可以是'arrayBuffer'、'blob'、'document'、'json'、'txt'、'stream',默认为json。axios官方文档地址:https://www.kancloud.cn/yunye/axios/234845(axios请求配置章节)。

所以我们接收后台传给前端的二进制流之前需要先设置responseType为blob,否则默认会以json获取,下载下来的文件打开会提示文件已损坏。控制台输出的可以看到是个正确的Blob对象,这就说明我们的配置是对的,如图1所示。

Vue通过Blob对象实现导出Excel功能示例代码

图1 控制台输出的Blob对象

后端最好也要配置response头的content-type为对应的类型,所图2所示。

Vue通过Blob对象实现导出Excel功能示例代码

图2 后端设置了响应头相对应的content-type

然后,需要给这个Blob对象设置一个type,这个type表明改Blob对象所包含数据的MIME类型。如果类型未知,则该值为空字符串。这里给出几个常用文件格式的MIME类型:(详细的可参考WebAPI官方文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)

扩展名----------MIME类型

.csv--------------text/csv

.jpeg/.jpg-------image/jpeg

.png-------------image/png

.rar--------------application/x-rar-compressed

.doc-------------application/msword

.docx-----------application/vnd.openxmlformats-officedocument.wordprocessingml.document

.xls--------------application/vnd.ms-excel

.xlsx------------application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

.zip--------------application/zip

在正常的导出请求之后可以看到又发了一个新的blob请求,其本质是到这个地址下载文件,如图3所示:

Vue通过Blob对象实现导出Excel功能示例代码

图3 创建一个临时的url指向blob对象

一般来说,这样就可以实现下载的功能了。

这里提点题外话,谷歌浏览器下载设置默认为浏览器下载默认路径,也就不会弹出文件框,谷歌浏览器下载文件框如图4所示,也就没有了所谓的自定义保存路径和自定义文件名,如图5所示,在浏览器底部会有下载提示。

Vue通过Blob对象实现导出Excel功能示例代码

图4谷歌浏览器下载文件框

Vue通过Blob对象实现导出Excel功能示例代码

图5 谷歌浏览器下载会在屏幕底部显示

如果想要有下载文件框,请在设置->高级->下载内容->下载前询问每个文件的保存位置中设置为启用。

总结

到此这篇关于Vue通过Blob对象实现导出Excel功能的文章就介绍到这了,更多相关vue 通过blob对象导出excel内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery获取地址栏参数插件(模仿C#)
Oct 26 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
Apr 08 Javascript
15个jquery常用方法、小技巧分享
Jan 13 Javascript
Bootstrap表单组件教程详解
Apr 26 Javascript
微信小程序 教程之WXSS
Oct 18 Javascript
基于Marquee.js插件实现的跑马灯效果示例
Jan 25 Javascript
js 获取今天以及过去日期
Apr 11 Javascript
javaScript产生随机数的用法小结
Apr 21 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
Sep 06 Javascript
浅谈开发eslint规则
Oct 01 Javascript
小程序实现列表展开收起效果
Jul 29 Javascript
javascript解析json格式的数据方法详解
Aug 07 Javascript
Vue.js中使用Vuex实现组件数据共享案例
Jul 31 #Javascript
原生JS实现记忆翻牌游戏
Jul 31 #Javascript
js实现跳一跳小游戏
Jul 31 #Javascript
js实现翻牌小游戏
Jul 31 #Javascript
Vue 请求传公共参数的操作
Jul 31 #Javascript
vue2.0 解决抽取公用js的问题
Jul 31 #Javascript
vue实现公共方法抽离
Jul 31 #Javascript
You might like
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
Yii核心验证器api详解
2016/11/23 PHP
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
JavaScript学习笔记之创建对象
2016/03/25 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python根据京东商品url获取产品价格
2015/08/09 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
浅谈python标准库--functools.partial
2019/03/13 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
介绍一下Linux文件的记录形式
2012/04/18 面试题
JAVA招聘远程笔试题
2015/07/23 面试题
总经理助理岗位职责范本
2014/07/20 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
六年级学生评语大全
2014/12/26 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js