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 创建对象(常见的几种方法)
Nov 03 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Dec 28 Javascript
javascript日期格式化方法小结
Dec 17 Javascript
js实现京东轮播图效果
Jun 30 Javascript
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
浅谈js的解析顺序 作用域 严格模式
Oct 23 Javascript
javascript的delete运算符知识点总结
Nov 19 Javascript
vue实现路由不变的情况下,刷新页面操作示例
Feb 02 Javascript
浅谈JavaScript 声明提升
Sep 14 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
Nov 02 Javascript
javascript局部自定义鼠标右键菜单
Dec 08 Javascript
js实现验证码干扰(动态)
Feb 23 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
Search Engine Friendly的URL设计
2006/10/09 PHP
一个好用的分页函数
2006/11/16 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
javascript 必知必会之closure
2009/09/21 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
2019/10/22 Javascript
js实现动态时钟
2020/03/12 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
Python发送邮件测试报告操作实例详解
2018/12/08 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
python怎么调用自己的函数
2020/07/01 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
《胖乎乎的小手》教学反思
2014/02/26 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
办公用品管理制度
2015/08/04 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server
Redis集群的关闭与重启操作
2021/07/07 Redis