`
齐晓威_518
  • 浏览: 618670 次
  • 性别: 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 的字符串呢?我这里有这么一个需求

相关推荐

    Java实现字节流与图片的转化

    如果需要在程序中操作图片,可以使用Java的`javax.imageio`包中的`ImageIO`类将字节流转换为`BufferedImage`对象: ```java BufferedImage image; try (InputStream is = new ByteArrayInputStream(imageData))...

    Java字节流 .pdf

    + FileOutputStream(FileDescriptor fdObj):创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。 在Java中,字节流是非常重要的概念,它们广泛应用于...

    字节流生成word文档

    标题“字节流生成word文档”涉及到的是在Java编程中如何使用字节流技术来创建Microsoft Word(.doc或.docx)文件。字节流是Java IO中的一个重要概念,它用于处理二进制数据,如图像、音频、视频或者如Word文档这样的...

    Java 发送邮件,附件从流中读取,数据生成excel并输出到流中

    当有需求,需要把当天的报表文件发送给指定邮箱又不小生成多余的...实现过程是先将数据库里的数据,导出excel文件输出流中(注:不是直接生成文件),发送邮件时附件内容直接从前面excel文件输出流中获取,然后发送邮件

    Java字符流与字节流区别

    字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流...

    java 发邮件带excel附件,以流的形式发送附件,不生成excel文件

    在某些场景下,我们可能希望直接以流的形式处理Excel数据,而不是先将其保存为一个实际的文件,然后再作为附件发送。这样可以节省磁盘空间,提高效率。本文将详细介绍如何在Java中实现这个功能。 首先,我们需要...

    Java字符流和字节流

    ### Java字符流和字节流详解 #### 一、引言 在Java中,I/O流主要用于处理输入输出操作,包括文件读写等。根据处理数据类型的不同,Java I/O流主要分为字节流和字符流两大类。字节流处理的是8位的字节数据,而字符流...

    Java实现字节流与图片的转化Java源码

    在Java编程中,字节流(Byte Stream)是处理数据的基本方式,特别是在处理二进制数据,如图片、音频或视频文件时。本教程将详细讲解如何使用Java实现字节流与图片之间的转换,这对于在网络上传输或者存储图片等二...

    java操作excel数据的导入导出,java流的读取

    在Java编程中,处理Excel数据的导入和导出是一项常见的任务,特别是在数据分析、报表生成以及数据交换等场景。本文将详细讲解如何使用Java操作Excel数据,并重点探讨Java流的读取技术。 首先,Java中处理Excel文件...

    C# 将图片文件转换成字节流存储在TXT

    本篇将深入探讨如何使用C#将图片文件转换为字节流,并将其存储在TXT文本文件中。 首先,我们需要理解字节流的概念。字节流是数据在计算机内存或磁盘间传输的基本单元,它可以是输入流(读取数据)或输出流(写入...

    ByteIO_java_字节流_

    本文将详细解析"ByteIO_java_字节流_"这个主题,主要基于提供的`ByteIO.java`源代码文件,探讨字节流的基本概念、分类、常用类以及在实际应用中的实现。 首先,字节流被分为两类:输入流(InputStream)和输出流...

    Java IO字符流和字节流

    ### Java IO字符流和字节流详解 #### 一、引言 在Java编程中,输入输出(简称IO)操作是十分重要的一个方面。通过IO操作,我们可以读取文件、网络数据、用户输入等,也可以将数据写入到文件、网络、控制台等。Java...

    java遍历文件目录生成树结构txt文件

    `Dir.class`和`Dir.java`是这次操作的核心文件,其中`Dir.java`包含了遍历目录的代码,而`Dir.class`是编译后的字节码文件,可以在命令行环境中直接运行。 首先,让我们了解`java.io.File`类。这是Java标准库中的一...

    Java IO 字节流 字符流

    Java IO库设计时考虑到了字节流和字符流之间的转换,为此提供了两个桥接流:InputStreamReader和OutputStreamWriter。InputStreamReader将字节流转换为字符流,它需要一个字符集作为参数来解码字节;...

    JAVA 字符流与字节流

    在Java编程语言中,输入/输出(I/O)操作是处理数据流的关键部分,而字符流与字节流则是实现这些操作的两种基本方式。理解它们的区别和应用场景对于任何Java开发者来说都是至关重要的。 ### 字节流 字节流是最基本...

    C#将图片和字节流互相转换并显示到页面上

    图片转换成字节流先要转换的IMage对象,转换之后返回字节流。字节流转换成图片,要转换的字节流,转换得到的Image对象,根据图片路径返回图片的字节流,感兴趣的朋友看下下面的代码。 C#将图片和字节流相互转换代码...

    java 导出 excel 高性能框架 iexcel 获取文件字节流内容.pdf

    - **获取文件字节流内容**:IExcel允许获取Excel文件内容的字节流,以便用户进行自定义操作。 2. **字段顺序问题与解决方案**: - **字段顺序的不确定性**:在某些情况下,由于JVM的内存对齐策略,Java字段的反射...

    Java中对于字节流的读取方式

    它们允许将Java对象转换为字节流,并从字节流中恢复对象。 5. **ZipInputStream** 和 **ZipOutputStream**:用于处理ZIP压缩格式的文件,可以读取和写入多个压缩过的条目。 6. **GZIPInputStream** 和 **...

    Java千万级别数据生成文件思路和优化

    一年前写过一个百万级别数据库数据生成配置xml文件的程序,程序目的是用来把数据库里面的数据生成xml文件.程序可以配置多少文件生成到一个文件中去。程序刚开始设计的时候说的是最多百万级别数据,最多50W数据生成到...

Global site tag (gtag.js) - Google Analytics