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 相关文章推荐
JavaScript实现QueryString获取GET参数的方法
Jul 02 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
Mar 28 Javascript
Jquery解析Json格式数据过程代码
Oct 17 Javascript
JavaScript中的事件委托及好处
Jul 12 Javascript
AngularJS用户选择器指令实例分析
Nov 04 Javascript
jquery横向纵向鼠标滚轮全屏切换
Feb 27 Javascript
VUE实现表单元素双向绑定(总结)
Aug 08 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
Nov 28 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
Sep 30 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
Dec 03 Javascript
js控制随机数生成概率代码实例
Mar 21 Javascript
js实现随机圆与矩形功能
Oct 29 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
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
PHP详细彻底学习Smarty
2008/03/27 PHP
php生成excel文件的简单方法
2014/02/08 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
为Python的web框架编写前端模版的教程
2015/04/30 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
python查看模块,对象的函数方法
2018/10/16 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
Html5之webcoekt播放JPEG图片流
2020/09/22 HTML / CSS
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
承诺书样本
2014/08/30 职场文书
旅游投诉信范文
2015/07/02 职场文书