博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在做excel导出时如何将workbook直接写在输出流中
阅读量:5208 次
发布时间:2019-06-14

本文共 2881 字,大约阅读时间需要 9 分钟。

参考网址

https://blog.csdn.net/u011109420/article/details/51330677

https://blog.csdn.net/u012116457/article/details/49780677

Java 后台 Excel 文件生成后转化为字节流java excel 使用 poi组件, HSSFWorkbook workBook = new HSSFWorkbook(); 对于workBook生成字节流,很容易发现有个workBook .getBytes(),但是,是不可用的,下载以后打不开,如果下载,正确的写法为workBook.write(response.getOutputStream());如果转化为字节流:ByteArrayOutputStream os = new ByteArrayOutputStream();try {workBook.write(os);ByteArray bytes = os.toByteArray(); String fileName = "xxx.xls";               response.reset();                response.setContentType("application/msexcel;charset=utf-8");                response.setHeader("Content-disposition", "attachment;filename= "+ fileName);                response.getOutputStream().write(bytes.getRawBytes());               response.getOutputStream().flush();               response.getOutputStream().close();           } catch (IOException e) {               // TODO Auto-generated catch block            e.printStackTrace();          }       上代码经过验证可行。dwr的写法:ByteArrayOutputStream os = new ByteArrayOutputStream();  try  {   hssfWorkbook.write(os);   return new FileTransfer(new String("XXXX.xls".getBytes(),"iso8859-1"),  "application/ms-excel", os.toByteArray());  }  catch (IOException e)  {   e.printStackTrace();  }这里,我们使用了ByteArrayOutputStream和ByteArrayInputStream类...处理的思想是,将HSSFWorkbook 写入ByteArrayOutputStream. 然后用ByteArrayOutputStream来转换为字节流..然后再将字节流转换为ByteArrayInputStream ..至此,我们就在内存中将excel转换成了输入流..代码如下ByteArrayOutputStream os = new ByteArrayOutputStream();  try {   wb.write(os);  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  byte[] b = os.toByteArray();  ByteArrayInputStream in = new ByteArrayInputStream(b);全部的代码太多,不贴上来了..相信大家都愿意用这个办法..因为使用之前说的那个产生随机文件名的办法.要繁琐的多...总结首先,我们必须明确我们所要实现的功能.我们在之前已经使用SHHF完成了excel的生成,现在的工作是将这个excel转换成输入流提供给struts2以实现下载...也就是说我们是要转换成输入流....明确了目标以后,我们将开始设计...我们的思路是,先创建一个输出流,将这个excel写入到输出流里面,然后再通过这个输出流来得到我们所需要的输入流...这里我们尝试了两张办法.第一种,就是使用临时文件的办法.我们创建的输出流先将内容写入到临时文件里面,然后我们从临时文件里读取输入流.这个办法我们用到的是FileOutputStream 和FileInputStream.但是临时文件的问题让程序变得异常复杂,所以我们的目标改成在内存中完成对excel到输入流的转换.所以我们用到了ByteArrayInputStream 和ByteArrayOutputStream .其实就是这么简单..最后附上从Excel模板获得需要导出的EXCEL文件的输入流方法。Java代码    public InputStream getExcelISForAs(List list) throws Exception {            InputStream excelStream = null;            FileInputStream fis = new FileInputStream(templatePath + "/template.xls");            HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(fis));            fis.close();            generateExcelForAs(list, wb);//填充EXCEL内容方法            ByteArrayOutputStream out = new ByteArrayOutputStream();            HSSFWorkbook hssWb = (HSSFWorkbook) wb;            hssWb.write(out);          excelStream = new ByteArrayInputStream(out.toByteArray());          out.close();          return excelStream;  }

  

转载于:https://www.cnblogs.com/alice-cj/p/10363123.html

你可能感兴趣的文章
Java中写文件操作
查看>>
js,jquery,css,html5特效
查看>>
python 进程池Pool以及Queue的用法
查看>>
while 循环、格式化输出、运算符
查看>>
Combination Sum III -- leetcode
查看>>
中国剩余定理
查看>>
MongoDB一些基本的命令
查看>>
尚未为数据源“RptDataSet_StatEC”提供数据源实例
查看>>
POJ 1410 Intersection
查看>>
Linux服务部署:nginx服务 nfs服务
查看>>
Spring Boot热部署(springloader)
查看>>
我要写一篇动态计算tableView-cell高度的随笔
查看>>
2.2 数据库高速缓冲区
查看>>
开启Golang编程第一章
查看>>
Java技术——I/O知识学习
查看>>
Android5.0之CoordinatorLayout的使用
查看>>
JS实践与写博客-序
查看>>
斗地主算法的设计与实现(五)--洗牌和发牌
查看>>
《mysql必知必会》笔记
查看>>
protocol buffer的简单使用
查看>>