java 后台 Excel 文件生成后转化为字节流

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();

          }       上代码经过验证可行。

 

 

 

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";

runData.getResponse().reset();

runData.getResponse().setContentType("application/msexcel;charset=utf-8");

runData.getResponse().setHeader("Content-disposition", "attachment;filename= "+ fileName);

 

runData.getResponse().getOutputStream().write(bytes.getRawBytes());

runData.getResponse().getOutputStream().flush();

runData.getResponse().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();
  }

 

 

 

 

 

 

 

这里,我们使用了ByteArrayOutputStreamByteArrayInputStream...处理的思想是,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代码  

1.  public InputStream getExcelISForAs(List<Object> list) throws Exception {  

2.          InputStream excelStream = null;  

3.          FileInputStream fis = new FileInputStream(templatePath + "/template.xls");  

4.          HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(fis));  

5.          fis.close();  

6.          generateExcelForAs(list, wb);//填充EXCEL内容方法  

7.          ByteArrayOutputStream out = new ByteArrayOutputStream();  

8.          HSSFWorkbook hssWb = (HSSFWorkbook) wb;  

9.          hssWb.write(out);  

10.        excelStream = new ByteArrayInputStream(out.toByteArray());  

11.        out.close();  

12.        return excelStream;  

13.    }  

 

你可能感兴趣的:(Excel)