vue导出excel表格-后端返回blob流文件,前端接收并导出(处理导出以后打开文件损坏问题)

简介: vue导出excel表格-后端返回blob流文件,前端接收并导出(处理导出以后打开文件损坏问题)

问题描述

我们日常做项目,特别是后台管理系统,常常需要导出excel文件。实现方式有三种

方式一(后端处理)

后端直接返回一个excel表格地址,前端点击下载即可。不过这种方式,会导致后端的excel越存越多,造成冗余。不过如果是固定模板表格内容不会变得情况下,这种方式还是不错的。当然解决方案就是后端写一个定时器,每隔一段时间清理一次

看情况使用,如果是固定的表格,一两年都不更换的excel表格用这种方式倒是也可以的。后端固定写死只把这个固定的表格传递给前端,这样的话,也能用
方式二(后端处理)

后端返回一个blob流文件,这样的话,是一次性的流文件,使用一次就没了,就不会造成后端excel越存越多。这种方式挺好

目前这种方式使用的会稍微多一些点
方式三(前端处理)

前端保存需要导出的表格内容,然后下载并使用excel插件轮子,就可以导出了。不过众所周知,前端只是拿到数据,并展示数据的。如果表格内容比较多,或者用户对于前端速度有要求的话,或者主管老大不希望我们在项目中下载安装太多的轮子从而导致最终打包文件过大的话,这种方式就不太好

不推荐

流文件导出步骤

流文件导出注意事项

需要加responseType: 'blob',否则文件会损坏

注意,excel流文件一定要在请求的时候加上响应类型字段,也就是:responseType: 'blob'或者,responseType: 'arraybuffer' ,否则下载出来的excel文件就会损坏,就会打不开。损坏文件如下图所示:

ArrayBuffer和Blob一样,都是二进制数据的容器,而ArrayBuffer相比更为底层一些,他可以去操作去修改这些二进制值,以此同时,二者之间也是可以相互转换的。导出excel用哪个都行的

如何加responseType: 'blob'

我使用的axios发请求,所以需要在请求的时候加上,又因为给axios做了二次封装,使用了请求拦截器和相应拦截器,以及包装函数导出,(请求拦截器和相应拦截器就不写了,主要看包装函数导出)代码写法是这样的:

export default (method, url, data = null, headers = 'application/json;charset=UTF-8', responseType = null) => {
    if (method == "post") {
        return http({
            method: 'post',
            url: rootUrl + url,
            // url: url,
            data: data,
            headers: {
                'Content-Type': headers,
            }, 
            responseType: responseType // 相应类型如果有的话,就用接口中的,如果没有就默认为null
        });
    } else if (method == "get") {
        return http({
            method: 'get',
            url: rootUrl + url,
            // url: url,
            params: data,
            headers: {
                'Content-Type': headers
            },
            responseType: responseType // 相应类型如果有的话,就用接口中的,如果没有就默认为null
        });
    } else {
        return;
    }
}
这里包装的return出去的http函数接收的参数除了method请求方式、url请求地址、data请求参数、以及请求头(编码方式制定UTF-8)之外,再多一个相应类型responseType,默认为null,所以只需要在写接口的时候,最后一个位置参数附上就行了。

查看我们加上去的responseType

我们打印一下相应拦截器的结果就能看到了

http.interceptors.response.use((res) => {
    console.log('响应拦截器查看',res); // 打印这个结果就能看到responseType了
    return res.data
}, (error) => {
    return Promise.reject(error);
})

没加的responseType为null

加上就是blob或者ArrayBuffer

步骤一

在导出的接口加上声明接收参数 最后一个参数就是指定类型为blob或者arraybuffer

export const export = (params) => http("get", `api/export`, params, 'application/json; charset=UTF-8', 'arraybuffer')

步骤二

假设我们点击按钮导出excel表格

  // 导出按钮的回调函数中
  async outExcelData() {
      // 准备参数
      let params = xxx
      const res = await this.$api.export(params);
      const blob = new Blob([res]);  // 把得到的结果用流对象转一下
      var a = document.createElement("a"); //创建一个<a></a>标签
      a.href = URL.createObjectURL(blob); // 将流文件写入a标签的href属性值
      a.download = "基础工艺数据.xlsx"; //设置文件名
      a.style.display = "none";  // 障眼法藏起来a标签
      document.body.appendChild(a); // 将a标签追加到文档对象中
      a.click(); // 模拟点击了a标签,会触发a标签的href的读取,浏览器就会自动下载了
      a.remove(); // 一次性的,用完就删除a标签
    },

总结

注意,必须要声明流文件且得到的结果用流文件转一下,这样的话,就不会出现excel文件损坏、或者乱码的情况。

相关文章
|
2月前
|
缓存 前端开发
后端MultipartFile接收文件转Base64
后端MultipartFile接收文件转Base64
114 8
|
1月前
|
JavaScript 前端开发 API
vue获取图片的blob传给django后端
vue获取图片的blob传给django后端
35 4
|
19天前
|
缓存 前端开发
后端MultipartFile接收文件转Base64
后端MultipartFile接收文件转Base64
36 0
|
1月前
|
JSON 前端开发 数据格式
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
文章详细讲解了在SpringMVC中如何使用`@RequestMapping`进行路由映射,并介绍了前后端参数传递的多种方式,包括传递单个参数、多个参数、对象、数组、集合以及JSON数据,并且涵盖了参数重命名和从URL中获取参数的方法。
88 0
@RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)
|
1月前
|
前端开发 JavaScript Java
导出excel的两个方式:前端vue+XLSX 导出excel,vue+后端POI 导出excel,并进行分析、比较
这篇文章介绍了使用前端Vue框架结合XLSX库和后端结合Apache POI库导出Excel文件的两种方法,并对比分析了它们的优缺点。
251 0
|
1月前
|
JavaScript 索引
vue 表格数据上下移动并增加背景色
vue 表格数据上下移动并增加背景色
35 0
|
3月前
|
前端开发 Java Spring
Spring与Angular/React/Vue:当后端大佬遇上前端三杰,会擦出怎样的火花?一场技术的盛宴,你准备好了吗?
【8月更文挑战第31天】Spring框架与Angular、React、Vue等前端框架的集成是现代Web应用开发的核心。通过RESTful API、WebSocket及GraphQL等方式,Spring能与前端框架高效互动,提供快速且功能丰富的应用。RESTful API简单有效,适用于基本数据交互;WebSocket支持实时通信,适合聊天应用和数据监控;GraphQL则提供更精确的数据查询能力。开发者可根据需求选择合适的集成方式,提升用户体验和应用功能。
92 0
|
2天前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
12 1
|
12天前
|
存储 SQL API
探索后端开发:构建高效API与数据库交互
【10月更文挑战第36天】在数字化时代,后端开发是连接用户界面和数据存储的桥梁。本文深入探讨如何设计高效的API以及如何实现API与数据库之间的无缝交互,确保数据的一致性和高性能。我们将从基础概念出发,逐步深入到实战技巧,为读者提供一个清晰的后端开发路线图。
|
6天前
|
JSON API 开发者
构建高效API:后端开发中的RESTful最佳实践####
在数字化时代,API作为不同系统间通信的桥梁,其重要性日益凸显。本文将深入探讨RESTful API的设计原则与最佳实践,通过实际案例分析,揭示如何构建高效、可维护且易于使用的API接口,助力后端开发者提升项目质量与用户体验。 ####

热门文章

最新文章