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 相关文章推荐
window.open 以post方式传递参数示例代码
Feb 27 Javascript
自己实现ajax封装示例分享
Apr 01 Javascript
简单的jQuery入门指引
Jul 28 Javascript
jQuery使用$.ajax进行即时验证实例详解
Dec 11 Javascript
JavaScript正则表达式匹配 div  style标签
Mar 15 Javascript
Javascript中常用类型的格式化方法小结
Dec 26 Javascript
Javascript中数组去重与拍平的方法示例
Feb 03 Javascript
深入理解Javascript箭头函数中的this
Feb 13 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
Feb 14 Javascript
javascript过滤数组重复元素的实现方法
May 03 Javascript
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
Dec 10 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 之 没有mysql支持时的替代方案
2006/10/09 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
JavaScript变量的作用域全解析
2015/08/14 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
mac上配置Android环境变量的方法
2018/07/08 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
python 装饰器的基本使用
2021/01/13 Python
Pandas直接读取sql脚本的方法
2021/01/21 Python
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
软件测试工程师笔试题带答案
2015/03/27 面试题
道路交通安全实施方案
2014/03/12 职场文书
出国英文推荐信
2014/05/10 职场文书
2015年收银工作总结范文
2015/04/01 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python
python中的getter与setter你了解吗
2022/03/24 Python