Vue结合后台导入导出Excel问题详解


Posted in Javascript onFebruary 19, 2019

最近Vue项目中用到了导入导出功能,在网上搜索了一番之后,决定采用Blob方式,这也是大家推荐的一种的方式,特此做下记录。

导出Excel功能

这里不谈别人怎么实现的,我是从后台生成了Excel流文件返回给前端的。

下面具体看一下后台的代码:

/**
  * 批量导出用户
  * @param condition
  * @param response
  */
@PostMapping("/exportUser")
public void exportUser(@RequestBody UserQueryCondition condition,HttpServletResponse response){
 XSSFWorkbook book = new XSSFWorkbook();
 try {
  List<UserParam> list = indexService.exportUser(condition);
  if (list != null && list.size() > 0) {
   XSSFSheet sheet = book.createSheet("mySheent");
   String[] vals = {"用户ID", "邮箱账号","昵称","年龄","性别","状态", "注册时间"};
   createExcel(sheet, 0, vals);
   for (int i = 0; i < list.size(); i++) {
    UserParam entity = list.get(i);
    String[] vals2 = new String[]{String.valueOf(entity.getId()), entity.getEmail(), entity.getName(), String.valueOf(entity.getAge()),
            entity.getSex() == 0 ? "女":"男",entity.getRemoved() == 0 ? "启用":"禁用",entity.getRegisterDate()};
    createExcel(sheet, i + 1, vals2);
   }

   book.write(generateResponseExcel("用户列表",response));
  }
  book.close();
 }catch(Exception e){
  e.printStackTrace();
 }
}
/**
  * @param excelName
  *   要生成的文件名字
  * @return
  * @throws IOException
  */
private ServletOutputStream generateResponseExcel(String excelName, HttpServletResponse response) throws IOException {
 excelName = excelName == null || "".equals(excelName) ? "excel" : URLEncoder.encode(excelName, "UTF-8");
 response.setContentType("application/vnd.ms-excel;charset=utf-8");
 response.setHeader("Content-Disposition", "attachment; filename=" + excelName + ".xlsx");

 return response.getOutputStream();
}

对于第一个函数exportUser来说,主要是根据传回来的条件查询数据库并生成相应的Excel表格,之后book.write(generateResponseExcel(“用户列表”,response)); 这行代码调用第二个函数generateResponseExcel来生成流文件以及处理返回的Response。

这里需要注意的地方就两个:

response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + excelName + ".xlsx");

第一行application/vnd.ms-excel说明将结果导出为Excel

第二行说明提供那个打开/保存对话框,将文件作为附件下载

上面就是后台的全部代码了,接下来看一下前端的代码:

axios({
  method: 'post',
  url: 'http://localhost:19090/exportUser',
  data: {
   email: this.email,
   userIdArray: this.userIdArray,
   startRegisterDate: this.registerStartTime,
   endRegisterDate: this.registerEndTime
  },
  responseType: 'blob'
  }).then((res) => {
  console.log(res)
  const link = document.createElement('a')
  let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});
  link.style.display = 'none'
  link.href = URL.createObjectURL(blob);
  let num = ''
  for(let i=0;i < 10;i++){
   num += Math.ceil(Math.random() * 10)
  }
  link.setAttribute('download', '用户_' + num + '.xlsx')
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
  }).catch(error => {
  this.$Notice.error({
   title: '错误',
   desc: '网络连接错误'
  })
  console.log(error)
  })

这里为了方便做记录,我是直接在页面中使用axios发送了个post请求。

仔细看axios请求加了个responseType: 'blob'配置,这是很重要的

可以看一下请求成功之后返回的数据:

Vue结合后台导入导出Excel问题详解

可以看到请求返回了一个Blob对象,你如果没有正确的加上responseType: 'blob'这个参数,返回的就不是个Blob对象,而是字符串了。

接下来就是将返回的Blob对象下载下来了:

const link = document.createElement('a')
  let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});
  link.style.display = 'none'
  link.href = URL.createObjectURL(blob);
  let num = ''
  for(let i=0;i < 10;i++){
   num += Math.ceil(Math.random() * 10)
  }
  link.setAttribute('download', '用户_' + num + '.xlsx')
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)

上面这段代码重要的就一句:let blob = new Blob([res.data],{type: ‘application/vnd.ms-excel'});

其余的看看就行了。

Vue结合后台导入导出Excel问题详解

以上就是全部的Vue导出Excel前后端代码了。

导入Excel功能

其实对于这个导入Excel没有什么好说的,就和你没采用前后分离时使用SpringMVC导入Excel表格一样。Vue前端导入Excel代码和Vue上传图片的代码没有区别,就是将Excel文件传到后台,之后就是后台处理文件的逻辑了,这个就不具体写了,因为和以前没区别。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
地震发生中逃生十大法则
May 12 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
JavaScript中的定时器之Item23的合理使用
Oct 30 Javascript
深入浅析JS Function()构造函数
Aug 22 Javascript
jQuery实现的表格展开伸缩效果实例
Sep 07 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
Jan 14 Javascript
JavaScript日期对象(Date)基本用法示例
Jan 18 Javascript
AngularJS前端页面操作之用户修改密码功能示例
Mar 27 Javascript
微信小程序自定义键盘 内部虚拟支付
Dec 20 Javascript
Vue.js中该如何自己维护路由跳转记录
May 19 Javascript
详解webpack的文件监听实现(热更新)
Sep 11 Javascript
小程序自定义圆形进度条
Nov 17 Javascript
Vue.js实现可排序的表格组件功能示例
Feb 19 #Javascript
Angular7创建项目、组件、服务以及服务的使用
Feb 19 #Javascript
小程序转发探索示例
Feb 19 #Javascript
JS异步执行结果获取的3种解决方式
Feb 19 #Javascript
jQuery AJAX与jQuery事件的分析讲解
Feb 18 #jQuery
基于node.js实现爬虫的讲解
Feb 18 #Javascript
简单实现vue中的依赖收集与响应的方法
Feb 18 #Javascript
You might like
理解和运用PHP中的多态性[译]
2011/08/02 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
php多重接口的实现方法
2015/06/20 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
你真的了解JavaScript吗?
2007/02/24 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
pytorch forward两个参数实例
2020/01/17 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
使用canvas压缩图片上传的方法示例
2020/02/07 HTML / CSS
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
Tommy Hilfiger美国官网:美国高端休闲领导品牌
2019/01/14 全球购物
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
《苏珊的帽子》教学反思
2014/04/07 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书