网站首页 > java教程 正文
这半年一直在参与一个新系统的软件开发,再此期间遇到了一个小小的问题,就是使用原生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()方法,忽略了正常应该使用的字节流或字符流。
猜你喜欢
- 2024-09-21 如何把excel表格处理成json数据(jason转excel)
- 2024-09-21 一个读Excel数据的小例子,提供给爱学习的Java后端开发
- 2024-09-21 快速将Excel、CSV等格式文件数据转换到java对象
- 2024-09-21 GitHub Star 8800+ 的阿里开源的 Java 解析 Excel 工具
- 2024-09-21 还在重复劳动?不如用Python自动生成Excel以邮件发送
- 2024-09-21 Java8如何让Excel的读写变得更加简单高效
- 2024-09-21 java打印Excel表格(java输出excel表格)
- 2024-09-21 整理关于java写入内容到excel的例子供大家参考
- 2024-09-21 JavaAPI开发(3)POI——如何将List转换为excel文件
- 2024-09-21 【Java程序】读取指定路径下文件夹中的文件名,生成Excel表格!
你 发表评论:
欢迎- 最近发表
-
- class版本不兼容错误原因分析(class更新)
- 甲骨文Oracle公司为Java的最新LTS版本做出改进
- 「版本发布」Minecraft Java开发版 1.19.4-pre1 发布
- java svn版本管理工具(svn软件版本管理)
- 我的世界1.8.10钻石在第几层(我的世界1.7.2钻石在哪层)
- Java开发高手必备:在电脑上轻松切换多个JDK版本
- 2022 年 Java 开发报告:Java 8 八年不到,开发者都在用什么?
- 开发java项目,选择哪个版本的JDK比较合适?
- Java版本选型终极指南:8 vs 17 vs 21特性对决!大龄程序员踩坑总结
- POI Excel导入(poi excel导入附件)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)