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 相关文章推荐
document 和 document.all 分别什么时候用
Jun 22 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
Jun 30 Javascript
JavaScript极简入门教程(二):对象和函数
Oct 25 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
Jun 24 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
Sep 07 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
Apr 29 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
Oct 26 Javascript
微信小程序实现页面跳转传值的方法
Oct 12 Javascript
让axios发送表单请求形式的键值对post数据的实例
Aug 11 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
图文详解vue框架安装步骤
Feb 12 Javascript
js用正则表达式筛选年月日的实例方法
Jan 04 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成功与否的代码
2013/08/16 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
JS request函数 用来获取url参数
2010/05/17 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
Laravel admin实现消息提醒、播放音频功能
2019/07/10 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
Python找出最小的K个数实例代码
2018/01/04 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
python在协程中增加任务实例操作
2021/02/28 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
巧克力蛋糕店创业计划书
2014/01/14 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
车间主任岗位职责
2014/03/16 职场文书
报关报检委托书
2014/04/08 职场文书
晚会闭幕词
2015/01/28 职场文书
2015年学校总务处工作总结
2015/05/19 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书
redis内存空间效率问题的深入探究
2021/05/17 Redis
解析redis hash应用场景和常用命令
2021/08/04 Redis