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

文章讲述了在开发过程中遇到的问题,即使用原生POI导出Excel时生成非标准格式文件且文件名不正确。作者发现错误在于未将Workbook写入文件流,导致数据量大时导出非标准格式。通过正确使用字节流和设置响应头解决了这个问题。
摘要由CSDN通过智能技术生成

这半年一直在参与一个新系统的软件开发,再此期间遇到了一个小小的问题,就是使用原生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()方法,忽略了正常应该使用的字节流或字符流。

欢迎大家加入CSDN开发云CSDN开发云

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值