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 location几个方法小姐
Jul 09 Javascript
类似GMAIL的Ajax信息反馈显示
Feb 16 Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
Mar 12 Javascript
Raphael带文本标签可拖动的图形实现代码
Feb 20 Javascript
JS图片根据鼠标滚动延时加载的实例代码
Jul 13 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
Jan 13 Javascript
angularjs中的单元测试实例
Dec 06 Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 Javascript
JS中实现函数return多个返回值的实例
Feb 21 Javascript
Bootstrap Multiselect 常用组件实现代码
Jul 09 Javascript
基于rollup的组件库打包体积优化小结
Jun 18 Javascript
解决vue+webpack项目接口跨域出现的问题
Aug 10 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
php 字符串函数收集
2010/03/29 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
Laravel框架数据库迁移操作实例详解
2020/04/06 PHP
js自带函数备忘 数组
2006/12/29 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
Python标准库之Sys模块使用详解
2015/05/23 Python
bpython 功能强大的Python shell
2016/02/16 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
python 回溯法模板详解
2020/02/26 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Django 解决由save方法引发的错误
2020/05/21 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
中医药大学毕业生自荐信
2013/11/08 职场文书
办公室内勤岗位职责范本
2013/12/09 职场文书
社区巾帼文明岗事迹材料
2014/06/03 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技