从Apache POI Workbook获取InputStream

时间:2014-01-16 08:12:53

标签: java excel apache-poi inputstream

有没有办法获得Apache的POI工作簿的InputStream

我需要它来管道到另一个OutputStream,但是我无法找到这样的方法(如果它存在)。

如果没有,有关其他方法的提示吗?

4 个答案:

答案 0 :(得分:7)

有几种方法可以解决这个问题:

  1. 您可以使用标准的java PipetInputStreamPipedOutputStream。但是您必须创建不同的线程才能使用PipedInputStream(如http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html
  2. 中所述
  3. 您可以将内容写入ByteArrayOutputStream,然后您可以通过ByteArrayInputStream使用生成的字节数组。这可以在一个线程中顺序完成。

答案 1 :(得分:4)

以下是如何实现Alexander Tokarev答案的#2(即从工作簿中获取Inputstream):

    try {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        workbook.write(bos);
        byte[] barray = bos.toByteArray();
        InputStream is = new ByteArrayInputStream(barray);
    } catch (IOException e) {
        e.printStackTrace();
    }

答案 2 :(得分:0)

您可以查看https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java

这里他们使用从XLSX文件中获取的输入流将整个工作表转换为csv文件。

ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(this.xlsxPackage);
        XSSFReader xssfReader = new XSSFReader(this.xlsxPackage);
        StylesTable styles = xssfReader.getStylesTable();
        XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
        int index = 0;
        while (iter.hasNext()) {
            InputStream stream = iter.next();
            String sheetName = iter.getSheetName();
            this.output.println();
            this.output.println(sheetName + " [index=" + index + "]:");
            processSheet(styles, strings, new SheetToCSV(), stream);
            stream.close();
            ++index;
        }

答案 3 :(得分:0)

您可以扩展XSSFWorkbook,从构造函数中保存File或InputStream对象,然后使用getInputStream()等方法将其恢复。