vue中后端做Excel导出功能返回数据流前端如何做处理

       项目中有一个导出功能的实现,用博客来记录一下。因为需求对导出表格的数据格式和样式有要求,所以这个导出功能放到后端来做,而且后端返回的是数据流,所以需要处理成想要的表格并导出来。

先看下效果图:

页面效果:


 

点击 导出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的效果图:

  • 23
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
好的,那么您可以使用Apache POI库来实现Excel导出,同时结合Spring Boot的响应体ResponseBody和HTTP状态码来实现导出Excel成功时返回Blob,失败时返回指定报错信息的功能。 具体实现步骤如下: 1. 后端使用Apache POI库创建Excel文件并写入数据。 2. 在Controller定义一个导出Excel的接口,使用ResponseBody注解将Excel的二进制流写入响应体,并设置Content-Type为application/vnd.ms-excel,这样前端就可以直接下载Excel文件。 3. 如果导出Excel遇到异常,可以使用try-catch语句捕获异常,并返回指定的报错信息。 4. 可以通过HTTP状态码来进一步标识导出Excel的结果,例如导出成功时返回200状态码,失败时返回500状态码。 下面是一个简单的示例代码,仅供参考: ```java @RestController public class ExcelController { @GetMapping("/exportExcel") public ResponseEntity<byte[]> exportExcel() { try { // 使用Apache POI创建Excel文件并写入数据 Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("sheet1"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("Hello World!"); // 将Excel的二进制流写入响应体 ByteArrayOutputStream out = new ByteArrayOutputStream(); wb.write(out); HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData("attachment", "example.xls"); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity<>(out.toByteArray(), headers, HttpStatus.OK); } catch (Exception e) { // 如果导出Excel遇到异常,返回指定的报错信息 return new ResponseEntity<>("导出Excel失败", HttpStatus.INTERNAL_SERVER_ERROR); } } } ``` 在前端,您可以使用axios或其他HTTP库来调用后端导出Excel接口,例如: ```javascript axios.get('/exportExcel') .then(response => { // 导出Excel成功,使用Blob对象创建一个URL并下载Excel文件 let url = URL.createObjectURL(new Blob([response.data])); let link = document.createElement('a'); link.style.display = 'none'; link.href = url; link.setAttribute('download', 'example.xls'); document.body.appendChild(link); link.click(); }) .catch(error => { // 导出Excel失败,展示错误信息 console.error(error.response.data); alert('导出Excel失败'); }); ``` 这样就可以实现导出Excel成功时返回Blob,失败时返回指定报错信息的功能了。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值