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 相关文章推荐
jquery CSS选择器笔记
Mar 29 Javascript
Javascript 面向对象编程(一) 封装
Aug 28 Javascript
javascript针对DOM的应用实例(一)
Apr 15 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
Nov 15 Javascript
js HTML5 Ajax实现文件上传进度条功能
Feb 13 Javascript
SWFUpload多文件上传及文件个数限制的方法
May 31 Javascript
响应式表格之固定表头的简单实现
Aug 26 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
Apr 28 Javascript
总结js中的一些兼容性易错的问题
Dec 18 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 jQuery
解决layui动态加载复选框无法选中的问题
Sep 20 Javascript
vue element ui validate 主动触发错误提示操作
Sep 21 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
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
PHP 和 HTML
2006/10/09 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
Python算法之栈(stack)的实现
2014/08/18 Python
决策树的python实现方法
2014/11/18 Python
python使用udp实现聊天器功能
2018/12/10 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
How TDD works
2012/09/30 面试题
口头翻译求职人自荐信
2013/12/07 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
麦当劳辞职信范文
2014/01/18 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
电子专业求职信
2014/06/19 职场文书
我的中国梦演讲稿800字
2014/08/19 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
应聘教师求职信范文
2015/03/20 职场文书
员工给公司的建议书
2019/06/24 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers
解析目标检测之IoU
2021/06/26 Python
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle