网站首页 > 精选教程 正文
这半年一直在参与一个新系统的软件开发,再此期间遇到了一个小小的问题,就是使用原生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()方法,忽略了正常应该使用的字节流或字符流。
猜你喜欢
- 2025-03-24 Java 转 Go 秘诀大放送!(java转换)
- 2025-03-24 优雅地实现EasyPoi动态导出列的两种方式
- 2025-03-24 Eclipse导出Jar包(包含外部包)(eclipse导出apk包方法)
- 2025-03-24 教你用MySQL导出一个ER图功能(如何导出mysql的所有表和数据)
- 2025-03-24 Java批量导入时,如何去除重复数据并返回结果?
- 2025-03-24 Chrome浏览器如何导出所有书签并导入书签
- 2025-03-24 java如何生成动态Word文件(java动态生成excel)
- 2025-03-24 JAVA POI实现大数据量excel文件读写及导出
- 2025-03-24 java使用JNA方式调用c++导出dll(java 调用c++ dll)
- 2025-03-24 Java通过clickhouse-client导出csv,百万数据3s内导出
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)