java-在Servlet端使用Excel表格生成内存中的zip文件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-在Servlet端使用Excel表格生成内存中的zip文件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2630字,纯文字阅读大概需要4分钟。
内容图文
![java-在Servlet端使用Excel表格生成内存中的zip文件](/upload/InfoBanner/zyjiaocheng/947/c1fef4b1fe0647009ee408314dddceea.jpg)
在这里,基本上我正在尝试将excel表格的zip文件从服务器发送到客户端.
方法1:我的Servlet代码
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(bos);
for(Map.Entry<String, List<Data>> entry : DatasMap.entrySet())
{
String fileName = entry.getKey();
List<Data> excelData = entry.getValue();
// The below code constructs the workbook and returns it
SXSSFWorkbook workBook = getWorkBook(fileName, excelData);
ZipEntry zipEntry = new ZipEntry(fileName );
zos.putNextEntry(zipEntry);
workBook.write(zos);
zos.closeEntry(); // getting error at this line
}
错误:
SEVERE: Servlet.service() for servlet [MyApp-server] in context with path [/myapp-server] threw exception
java.io.IOException: Stream closed
at java.util.zip.ZipOutputStream.ensureOpen(ZipOutputStream.java:82)
at java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:231)
方法2:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(bos);
ServletOutputStream out = response.getOutputStream();
for(Map.Entry<String, List<Data>> entry : DatasMap.entrySet())
{
String fileName = entry.getKey();
List<Data> excelData = entry.getValue();
// The below code constructs the workbook and returns it
SXSSFWorkbook workBook = getWorkBook(fileName, excelData);
ZipEntry zipEntry = new ZipEntry(fileName );
zos.putNextEntry(zipEntry);
workBook.write(bos);
bos.writeTo(zos)
zos.closeEntry(); // this line works perfectly in this case
}
zos.close();
byte[] bytes = bos.toByteArray();
//setting content-type and zip file name
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=Templates.zip");
out.write(bytes);
out.flush();
方法2可以正常工作,但是当我尝试在客户端打开zip文件时,出现错误提示错误提取
我不确定excel工作表是否已损坏或任何其他服务器端流问题.如果有任何有益的想法/想法,请与我分享.
解决方法:
您的第二次尝试失败,因为您是通过直接将工作簿写入基础ByteArrayOutputStream来混合压缩内容和未压缩内容.因此,生成的zip文件被搞砸了.
第一次尝试失败,因为workBook.write关闭ZipOutputStream并在写入第二个条目时收到Stream关闭异常.
但是您可以防止流关闭.创建一个无法关闭的帮助器OutputStream类:
public class NonCloseableOutputStream extends java.io.FilterOutputStream {
public NonCloseableOutputStream(OutputStream out) {
super(out);
}
@Override public void close() throws IOException {
flush();
}
}
并将该类的实例传递给工作簿:
// The below code constructs the workbook and returns it
SXSSFWorkbook workBook = getWorkBook(fileName, excelData);
ZipEntry zipEntry = new ZipEntry(fileName );
zos.putNextEntry(zipEntry);
workBook.write(new NonCloseableOutputStream(zos));
zos.closeEntry();
内容总结
以上是互联网集市为您收集整理的java-在Servlet端使用Excel表格生成内存中的zip文件全部内容,希望文章能够帮你解决java-在Servlet端使用Excel表格生成内存中的zip文件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。