Java使用输出流OutputStream导出Excel遇到的问题及解决方法

createh54个月前 (02-01)技术教程82

这半年一直在参与一个新系统的软件开发,再此期间遇到了一个小小的问题,就是使用原生POI导出Excel时,会生成非Excel格式的文件,而且文件名称也不是设置好的,而是导出的方法名,如下图;

不过这种文件选择打开方式Excel或者WPS都可以,但是对客户就不是很友好了,所以必须要查找一下问题所在。

在经过与同事的正常导出代码进行对比后,发现如下问题:

1. 在文件导出时,生成的Workbook数据要存入到字节流或字符流当中,并将流写入到response响应中;

2. 需要将文件名称格式化,并设置响应头;

现在将失败和成功代码分享如下:

错误

// 将工作簿写入输出流中

OutputStream outputStream = response.getOutputStream();

workbook.write(outputStream);

// 设置响应头,指定文件名和文件类型

response.setContentType("application/vnd.ms-excel"); // 设置为 Excel 文件类型

response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + ".xls\""); // 设置文件名为 fileName + ".xls"

// 关闭输出流和工作簿对象

outputStream.close();

workbook.close();

正确

// 将工作簿写入输出流中
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

workbook.write(byteArrayOutputStream);

byte[] bytes = byteArrayOutputStream.toByteArray();

// 设置响应头,指定文件名和文件类型

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

response.setHeader("Content-Disposition", "attachment; filename="+fileName+"-"+ DateUtils.getDate("yyyyMMddHHmmss")+".xls");

response.setContentLength(bytes.length);

// 关闭输出流和工作簿对象

ServletOutputStream outputStream = response.getOutputStream();

outputStream.write(bytes);

outputStream.flush();

outputStream.close();


根据代码对比可以看到,错版没有把workbook写入到文件流当中,只是将流写到了响应里边,就会导致当数据量超过分页时的数据量则导出的文件不是“xls”或者“xlsx”格式,而当数据量小于等于分页的数据量则可以导出“xls”或者“xlsx”文件格式。

这个问题确实疏忽了文件流的问题,一个是因为测试时数据量比较少,所以用错误写法导出时也是正常显示“xls”格式;另一个是因为只看到了响应中的getOutputStream()方法,忽略了正常应该使用的字节流或字符流。

相关文章

算法:有序数组的平方(Java版)(java 有序数组)

有序数组的平方题目描述:给定一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例:输入: nums = [-4,-1,0,3,10] 输出: [0,1...

趣味玩转数组:Java中的数组遍历技巧

当涉及到Java语言中的数组遍历和操作,我们可以从基本概念开始,逐步深入,以确保您理解得更全面。我们将覆盖以下主题:数组的基本概念声明和初始化数组数组的遍历常见的数组操作让我们一步一步来讲解这些内容:...

小菜鸟学Java--如何拿下数组(java数组截取到新数组)

前面谈及到了引用数据类型,数组就是一种,它还是比较重要的一种,本篇就来详细说说它和向量。数组先来说说数组。那么什么是数组呢?它是在数组的基础上的。数组是一种常用的引用数据类型,相同数据类型的元素按照一...

请讲解C#中数组的长度和范围与其他编程语言的区别与共性?

C# 中数组的长度和范围与其他编程语言的区别与共性数组是编程语言中常用的数据结构之一,各种语言对数组的长度和范围处理方式有所不同。以下是 C# 中数组的长度和范围的特性,以及与其他编程语言的对比。C#...

讲解C#中多维数组的长度和范围的特性和使用方法

在 C# 中,多维数组是一种可以包含多个维度(通常是二维或三维)的数组类型。理解其长度和范围的特性有助于正确使用和避免错误。以下是多维数组的长度、范围特性及其使用方法的详细讲解。1. 多维数组的定义和...

六十六、Leetcode数组系列(中篇)(leetcode684)

@Author:Runsen @Date:2020/6/8人生最重要的不是所站的位置,而是内心所朝的方向。只要我在每篇博文中写得自己体会,修炼身心;在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰难...