文件流方式导出Excel表格

       之前做的项目都是在不调用后台接口的情况下,将json数据导出到excel表格,纯前端去实现导出Excel,最近做的项目,需要向后台传递不同的参数值,后台查询出符合条件的数据,以文档流的格式返回前端,前端再导出为Excel,经查阅资料,用了两种方法实现,亲测有效。有什么写的不好的地方,望指出,大家一起进步!

   

 上图是后台返回的数据,此时前端需要把查询到的数据导出为excel格式,这里介绍两种方法:

第一种:

 getExcel() {
                const url = 'URL地址';
                this.$http.post(url, this.filter, {
                    responseType: 'blob'
                }).then(res => {
                    let blob = new Blob([res.data], {
                        type: "application/vnd.ms-excel",
                    });    
                    let objectUrl = URL.createObjectURL(blob);     
                    window.location.href = objectUrl;
                }).catch(err => {
                    console.warn(err);
                });
            },

注意设置responseType!!!

Blob() 构造函数返回一个新的 Blob 对象。 blob的内容由参数数组中给出的值的串联组成。

语法:var aBlob = new Blob( array, options );

Blob.type:一个字符串,表明该Blob对象所包含数据的MIME类型。如果类型未知,则该值为空字符串。

具体可参考MDN文档:Blob - Web API 接口 | MDN

此方法的缺陷:下载的excel文档的名字是创建的blob的url,且无法使创建的url为固定值,在每次调用 createObjectURL() 方法时,都会创建一个新的 URL 对象

第二种:

 //导出Excel
            getExcel() {
                const url = '你的URL';
                this.$http.post(url, params, {
                    responseType: 'blob'
                }).then(res => {
                    let blob = new Blob([res.data], {
                        type: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
                    })
                    if (window.navigator.msSaveOrOpenBlob) {
                        navigator.msSaveBlob(blob);
                    } else {
                        let elink = document.createElement('a');
                        elink.download = "报表.xls";
                        elink.style.display = 'none';
                        elink.href = URL.createObjectURL(blob);
                        document.body.appendChild(elink);
                        elink.click();
                        document.body.removeChild(elink);
                    }
                }).catch(err => {
                    console.warn(err);
                });
            },

第二种方法可以自己设置导出excel的名称。利用a链接,最后记得对a 链接进行移除。

之前写的 elink.download = "报表.xlsx";在自己电脑上没有问题,但是有两个同事反应说,导出的Excel下载之后无法打开。出现以下报错:

后来发现是版本问题 ,XLSX是高版本
07版以后的扩展名都是.xlsx ,是用新的基于XML的压缩文件格式取代了其目前专有的默认文件格式,在传统的文件名扩展名后面添加了字母x(即.docx取代.doc、.xlsx取代.xls,等等),使其占用空间更小,可以向下兼容xls。改为xls之后就没有问题了。

你学会了吗?

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
实现文档流导出Excel表格的方法有很多,这里介绍一种比较简单的方法: 1. 引入Apache POI库,这是一个Java处理Microsoft Office文档的开源库,包括Excel、Word和PowerPoint等。 2. 创建工作簿对象Workbook和工作表对象Sheet。 3. 在工作表中创建行对象Row和单元格对象Cell。 4. 将数据写入单元格中。 5. 将工作簿写入输出中,输出到客户端浏览器。 示例代码如下: ```java // 创建工作簿对象 Workbook workbook = new XSSFWorkbook(); // 创建工作表对象 Sheet sheet = workbook.createSheet("Sheet1"); // 创建行对象 Row row = sheet.createRow(0); // 创建单元格对象,并设置值 Cell cell = row.createCell(0); cell.setCellValue("姓名"); cell = row.createCell(1); cell.setCellValue("年龄"); // 写入数据 for(int i=1; i<=10; i++){ row = sheet.createRow(i); cell = row.createCell(0); cell.setCellValue("张三" + i); cell = row.createCell(1); cell.setCellValue(i); } // 输出到客户端浏览器 response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=test.xlsx"); OutputStream ouputStream = response.getOutputStream(); workbook.write(ouputStream); ouputStream.flush(); ouputStream.close(); ``` 以上代码中,response是HttpServletResponse对象,用于向客户端浏览器输出Excel文件。在输出前需要设置Content-type为application/vnd.ms-excel,Content-disposition为attachment,并指定文件名。最后将Workbook写入输出中即可。 注意:以上代码仅供参考,具体实现方式需要根据实际需求进行调整。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值