vue中后端做Excel导出功能返回数据流前端的处理操作


Posted in Javascript onSeptember 08, 2020

项目中有一个导出功能的实现,用博客来记录一下。因为需求对导出表格的数据格式和样式有要求,所以这个导出功能放到后端来做,而且后端返回的是数据流,所以需要处理成想要的表格并导出来。

先看下效果图:

页面效果:

vue中后端做Excel导出功能返回数据流前端的处理操作

点击 导出Excel 调用导出接口成功了:

vue中后端做Excel导出功能返回数据流前端的处理操作

后台返回的数据流,一堆看不懂的乱码:

vue中后端做Excel导出功能返回数据流前端的处理操作

接下来要处理这堆乱码,因为用到的地方多,所以在util.js文件里封装了一个公共方法并抛出:

虽然vue里有封装好的请求接口的方法,但这里要单独用axios,所以先在util.js里引入axios

import axios from 'axios'

// 导出Excel公用方法
export function exportMethod(data) {
  axios({
    method: data.method,
    url: `${data.url}${data.params ? '?' + data.params : ''}`,
    responseType: 'blob'
  }).then((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)
 
    // link.download = res.headers['content-disposition'] //下载后文件名
    link.download = data.fileName //下载的文件名
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
  }).catch(error => {
    this.$Notice.error({
      title: '错误',
      desc: '网络连接错误'
    })
    console.log(error)
  })
}

在使用的页面中引入方法:

import { exportMethod } from '@/libs/util'

在methods导出的方法里,调用共用导出方法。

注意:因为我们后台用的是get方法,所以传递get请求并且拼接要传的参数,如果是post请求,就把传递的get改成post,传递数据改成传data数据对象,params去掉,公共方法里把url上拼接的参数也去掉,直接 接收url路径即可,再接收一个data就行了

// 导出会诊接诊量统计表
    exportDepReceRank() {
      let myObj = {
        method: 'get',
        url: exportDepartmentRankUrl,
        fileName: 'XX医院—各科室会诊接诊量统计',
        params: `startDate=${changeDate(this.dateValue[0])}&endDate=${changeDate(this.dateValue[1])}`
      }
      exportMethod(myObj)
    },

最后成功导出Excel的效果图:

vue中后端做Excel导出功能返回数据流前端的处理操作

补充知识:Vue项目利用axios请求接口下载excel(附前后端代码)

据我了解的前端的下载方式有三种,第一种是通过a标签来进行下载,第二种时候通过window.location来下载,第三种是通过请求后台的接口来下载,今天就来记录一下这三种下载方式。

方法一:通过a标签

// href为文件的存储路径或者地址,download为问文件名

<a href="/images/logo.jpg" rel="external nofollow" download="logo" />

优点:简单方便。

缺点:这种下载方式只支持Firefox和Chrome不支持IE和Safari,兼容性不够好。

方法二:通过window.location

window.location = 'http://127.0.0.1:8080/api/download?name=xxx&type=xxx'

优点:简单方便。

缺点:只能进行get请求,当有token校验的时候不方便。

方法三:通过请求后台接口

// download.js
import axios from 'axios'

export function download(type, name) {
 axios({
  method: 'post',
  url: 'http://127.0.0.1:8080/api/download',
  // headers里面设置token
  headers: {
   loginCode: 'xxx',
   authorization: 'xxx'
  },
  data: {
   name: name,
   type: type
  },
  // 二进制流文件,一定要设置成blob,默认是json
  responseType: 'blob'
 }).then(res => {
  const link = document.createElement('a')
  const blob = new Blob([res.data], { type: 'application/vnd.ms-excel' })
  link.style.display = 'none'
  link.href = URL.createObjectURL(blob)
  link.setAttribute('download', `${name}.xlsx`)
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
 })
}
// download.java
@RequestMapping(value = "/api/download",produces = "application/octet-stream", method = RequestMethod.POST)
public void downloadTemplate(@RequestBody Map<String,Object> paramsMap, HttpServletResponse response) {
  try {
    if (paramsMap.get("type").equals("xxx") && paramsMap.get("name").equals("xxx")) {
      String[] str = new String[]{"区县","所属省份","所属地市"};
      Workbook workbook = ExportExcel.exportExcel("行政区划表模版", str, null, "yyyy-MM-dd");
      download(response, workbook, "CityDict");
    }
  } catch (Exception e) {
    e.printStackTrace();
  }
}

private void download(HttpServletResponse response, Workbook workbook, String fileName) {
  try {
    response.setContentType("application/octet-stream;charset=UTF-8;");
    response.addHeader("Content-Disposition", "attachment;fileName=" + fileName + ".xlsx");
    ByteArrayOutputStream by = new ByteArrayOutputStream();
    OutputStream osOut = response.getOutputStream();
    // 将指定的字节写入此输出流
    workbook.write(osOut);
    // 刷新此输出流并强制将所有缓冲的输出字节被写出
    osOut.flush();
    // 关闭流
    osOut.close();
  } catch (IOException e) {
    LogUtils.getExceptionLogger().info("下载模板错误:{}", e.getMessage());
  }
}

优点:可以在headers里面设置token,文件是java代码中生成的,生成的文件比较灵活。

缺点:实现起来比较复杂。

以上这篇vue中后端做Excel导出功能返回数据流前端的处理操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js设置组合快捷键/tabindex功能的方法
Nov 21 Javascript
JavaScript淡入淡出渐变简单实例
Aug 06 Javascript
easyui Draggable组件实现拖动效果
Aug 19 Javascript
jquery实现简单的banner轮播效果【实例】
Mar 30 Javascript
jQuery中的deferred对象和extend方法详解
May 08 jQuery
Angular4学习教程之DOM属性绑定详解
Jan 04 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
Nov 16 Javascript
Node.js爬虫如何获取天气和每日问候详解
Aug 26 Javascript
基于iview-admin实现动态路由的示例代码
Oct 02 Javascript
vue指令v-html使用过滤器filters功能实例
Oct 25 Javascript
Vue是怎么渲染template内的标签内容的
Jun 05 Javascript
vue prop传值类型检验方式
Jul 30 Javascript
vue等两个接口都返回结果再执行下一步的实例
Sep 08 #Javascript
基于postman获取动态数据过程详解
Sep 08 #Javascript
解决vue请求接口第一次成功,第二次失败问题
Sep 08 #Javascript
如何区分vue中的v-show 与 v-if
Sep 08 #Javascript
谈谈JavaScript中的函数
Sep 08 #Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
Sep 08 #Javascript
浅析JavaScript 函数柯里化
Sep 08 #Javascript
You might like
10个实用的PHP代码片段
2011/09/02 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
PHP设置进度条的方法
2015/07/08 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
FF IE兼容性的修改小结
2009/09/02 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
2019/09/23 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
Python3列表List入门知识附实例
2020/02/09 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
销售辞职报告范文
2014/01/12 职场文书
毕业生求职信的经典写法
2014/01/31 职场文书
人事部专员岗位职责
2014/03/04 职场文书
总经理工作职责范文
2014/03/14 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
交通安全责任书范本
2014/07/24 职场文书
会议欢迎词
2015/01/23 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
python通过函数名调用函数的几种方法总结
2021/06/07 Python
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python