`
齐晓威_518
  • 浏览: 625811 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

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.    }  

 

分享到:
评论
3 楼 AlanKay 2018-04-28  
Mart_dai 写道
Hi 齐晓威_518,

我想问问,在excel 到出的时候,你上面谈到我们先将 excel 的字节流写到ByteArrayOutputStream中,如下
workBook.write(os);
ByteArray bytes = os.toByteArray();

我的问题是转换为了 ByteArray 后能不能把它在装换为 String 的字符串呢?我这里有这么一个需求


这个可以把二进制转换成HEX字符串。我以前的项目做这个
2 楼 18335864773 2017-06-07  
国内的pageoffice插件也可以生成excel。也可以用流的方式打开excel。
POI、JXL技术不能在网页里显示编辑Office文档,只能在服务器端执行部分导入导出Office文档内容的任务;而PageOffice两者皆可。
PageOffice调用代码简洁高效。
1 楼 Mart_dai 2015-01-26  
Hi 齐晓威_518,

我想问问,在excel 到出的时候,你上面谈到我们先将 excel 的字节流写到ByteArrayOutputStream中,如下
workBook.write(os);
ByteArray bytes = os.toByteArray();

我的问题是转换为了 ByteArray 后能不能把它在装换为 String 的字符串呢?我这里有这么一个需求

相关推荐

    jsp页面数据通过excel导出

    "jsp页面数据通过excel导出"这个主题就是关于如何在Java Web应用程序中利用JSP(JavaServer Pages)技术和Apache POI库将动态生成的数据导出为Excel文件。Apache POI是一个强大的API,它允许开发者读写Microsoft ...

    java范例开发大全源代码

     7.2 字节流 169  实例123 复制指定目录下的文件 170  实例124 显示文件中的内容 173  实例125 将数据保存到指定的文件中 175  实例126 将由键盘中录入的信息保存到文件中 176  实例127 一个文件...

    java范例开发大全

    7.2 字节流 169 实例123 复制指定目录下的文件 170 实例124 显示文件中的内容 173 实例125 将数据保存到指定的文件中 175 实例126 将由键盘中录入的信息保存到文件中 176 实例127 一个文件变成多个小文件 178 实例...

    Java范例开发大全 (源程序)

     7.2 字节流 169  实例123 复制指定目录下的文件 170  实例124 显示文件中的内容 173  实例125 将数据保存到指定的文件中 175  实例126 将由键盘中录入的信息保存到文件中 176  实例127 一个文件变成多个...

    Java范例开发大全(全书源程序)

    7.2 字节流 169 实例123 复制指定目录下的文件 170 实例124 显示文件中的内容 173 实例125 将数据保存到指定的文件中 175 实例126 将由键盘中录入的信息保存到文件中 176 实例127 一个文件变成多个小文件 178 ...

    java范例开发大全(pdf&源码)

    7.2 字节流 169 实例123 复制指定目录下的文件 170 实例124 显示文件中的内容 173 实例125 将数据保存到指定的文件中 175 实例126 将由键盘中录入的信息保存到文件中 176 实例127 一个文件变成多个小文件 178 实例...

    2021-2022计算机二级等级考试试题及答案No.13481.docx

    - **详细解析**: 编译Java源代码文件(.java)后生成的字节码文件的扩展名为“.class”。字节码文件是由Java虚拟机执行的中间代码,可以跨平台运行。 #### 9. Internet协议基础 - **知识点**: Internet上不同网络...

Global site tag (gtag.js) - Google Analytics