如何从 HSSFWorkbook 对象获取输入流 [英] How can I get an Input Stream from HSSFWorkbook Object

查看:547
本文介绍了如何从 HSSFWorkbook 对象获取输入流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望我的 Web 应用程序用户将一些数据下载为 Excel 文件.

I want my web application users to download some data as an Excel file.

我有下一个函数可以在响应对象中发送一个输入流.

I have the next function to send an Input Stream in the response object.

public static void sendFile(InputStream is, HttpServletResponse response) throws IOException {
        BufferedInputStream in = null;
        try {
            int count;
            byte[] buffer = new byte[BUFFER_SIZE];
            in = new BufferedInputStream(is);
            ServletOutputStream out = response.getOutputStream();
            while(-1 != (count = in.read(buffer)))
                out.write(buffer, 0, count);
            out.flush();            
        }   catch (IOException ioe) { 
            System.err.println("IOException in Download::sendFile"); 
            ioe.printStackTrace();
        } finally {
            if (in != null) {
                try { in.close(); 
                } catch (IOException ioe) { ioe.printStackTrace(); }
            }   
        }
    }

我想将我的 HSSFWorkbook 对象转换为输入流并将其传递给前一个方法.

I would like to transform my HSSFWorkbook Object to an input stream and pass it to the previous method.

public InputStream generateApplicationsExcel() {
    HSSFWorkbook wb = new HSSFWorkbook();
    // Populate the excel object
    return null; // TODO. return the wb as InputStream 
}

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFWorkbook.html

推荐答案

你的问题的问题在于你混合了 OutputStreams 和 InputStreams.InputStream 是您从中读取的内容,OutputStream 是您写入的内容.

The problem with your question is that you are mixing OutputStreams and InputStreams. An InputStream is something you read from and an OutputStream is something you write to.

这就是我将 POI 对象写入输出流的方式.

This is how I write a POI object to the output stream.

// this part is important to let the browser know what you're sending
response.setContentType("application/vnd.ms-excel");
// the next two lines make the report a downloadable file;
// leave this out if you want IE to show the file in the browser window
String fileName = "Blah_Report.xls";
response.setHeader("Content-Disposition", "attachment; filename=" + fileName); 

// get the workbook from wherever
HSSFWorkbook wb = getWorkbook();
OutputStream out = response.getOutputStream();
try {
   wb.write(out);
}       
catch (IOException ioe) { 
  // if this happens there is probably no way to report the error to the user
  if (!response.isCommited()) {
    response.setContentType("text/html");
    // show response text now
  }
}

如果您想重新使用现有代码,则必须将 POI 数据存储在某处,然后将其转换为输入流.通过将其写入 ByteArrayOutputStream,然后使用 ByteArrayInputStream 读取这些字节,这很容易完成,但我不推荐它.您现有的方法作为通用 Pipe 实现会更有用,您可以在其中将数据从 InputStream 传送到 OutputStream,但不需要它来编写 POI 对象.

If you wanted to re-use your existing code you'd have to store the POI data somewhere then turn THAT into an input stream. That'd be easily done by writing it to a ByteArrayOutputStream, then reading those bytes using a ByteArrayInputStream, but I wouldn't recommend it. Your existing method would be more useful as a generic Pipe implementation, where you can pipe the data from an InputStream to and OutputStream, but you don't need it for writing POI objects.

这篇关于如何从 HSSFWorkbook 对象获取输入流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆