网站首页 > 教程文章 正文
这半年一直在参与一个新系统的软件开发,再此期间遇到了一个小小的问题,就是使用原生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()方法,忽略了正常应该使用的字节流或字符流。
- 上一篇: WEB常见漏洞之反序列化分析与防御
- 下一篇: SpringBoot中几种文件上传下载工具
猜你喜欢
- 2025-05-27 还在为 Spring Boot3 整合 Easy Excel 发愁?一文搞定!
- 2025-05-27 7种方式,教你提升 SpringBoot 项目的吞吐量
- 2025-05-27 Tomcat处理HTTP请求流程解析
- 2025-05-27 SpringBoot中六种设计模式应用案例二
- 2025-05-27 生产实战:循环继承依赖 导致web 项目启动失败,总是超时
- 2025-05-27 Java Web应用调优线程池:没你想的那么复杂
- 2025-05-27 SpringMVC异常处理句柄这些细节你知道吗?
- 2025-05-27 惊呆了!Controller接口返回值支持17种逆天类型
- 2025-05-27 【干货】EasyExcel确实好用,Springboot+EasyExcel实操
- 2025-05-27 Spring Boot 应用如何防护 XSS 攻击
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)