Java 从 Apache 的 POI 工作簿获取 InputStream

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21156461/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 06:59:05  来源:igfitidea点击:

Get InputStream from Apache's POI Workbook

javaexcelapache-poiinputstream

提问by ioreskovic

Is there a way to obtain InputStreamof Apache's POI Workbook?

有没有办法获得InputStreamApache 的 POI 工作簿?

I need it for piping to another OutputStream, however I'm unable to find such method (If it exists).

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

If it doesn't, any tips on alternative ways to obtain it?

如果没有,有关获取它的其他方法的任何提示?

采纳答案by Alexander Tokarev

There's a several ways to solve this:

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

  1. You can use standard java PipetInputStreamand PipedOutputStream. But you have to create different thread for using PipedInputStream(as described in http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html)
  2. You can write the content to ByteArrayOutputStream, and then you can use resulting byte array via ByteArrayInputStream. This can be done sequentially in one thread.
  1. 您可以使用标准的 javaPipetInputStreamPipedOutputStream. 但是您必须创建不同的线程以供使用PipedInputStream(如http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html 中所述
  2. 您可以将内容写入ByteArrayOutputStream,然后您可以通过 使用生成的字节数组ByteArrayInputStream。这可以在一个线程中按顺序完成。

回答by Vinit Kumarq

You can check https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java

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

here they are converting the whole sheet to csv file, using inputstream which they got from XLSX file.

在这里,他们使用从 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;
        }

回答by Kehinde Adedamola Shittu

Here's how to implement #2 of Alexander Tokarev's answer (i.e get Inputstream from a workbook):

以下是如何实现 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();
    }

回答by LottaLava

You can extend XSSFWorkbook, save the File or InputStream object from constructor and them get it back with some method like getInputStream()

您可以扩展 XSSFWorkbook,从构造函数中保存 File 或 InputStream 对象,然后他们使用诸如 getInputStream() 之类的方法将其取回