2014-01-16 51 views
1

有沒有辦法獲得Apache的POI工作簿InputStream獲取InputStream forom Apache的POI工作簿

我需要它來管道到另一個OutputStream,但我找不到這樣的方法(如果存在)。

如果沒有,還有其他方法獲取它的提示?

+1

爲什麼不使用它的'write'方法? (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Workbook.html#write(java.io.OutputStream)) –

+0

我知道這種方法,但是,我有一些要求這樣我需要一個輸入流。 – Lopina

+1

寫入'ByteArrayOutputStream',寫入完成後從中獲取字節數組,然後將其傳遞給'ByteArrayInputStream'? – Gagravarr

回答

7

有多種方法可以解決這個問題:

  1. 您可以使用標準的Java PipetInputStreamPipedOutputStream。但您必須創建不同的線程才能使用PipedInputStream(如http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html中所述)
  2. 您可以將內容寫入ByteArrayOutputStream,然後您可以使用結果字節數組通過ByteArrayInputStream。這可以在一個線程中順序完成。
+0

是的,我雖然#2作爲替代,猜猜這就是它。 – Lopina

0

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

在這裏他們將全片以csv文件,使用的InputStream他們從XLSX文件了。

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; 
     } 
0

這裏是如何執行#2亞歷山大·託卡列夫的回答(即從一個工作簿中獲得的InputStream):

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

可以擴展XSSFWorkbook,保存文件或InputStream對象的構造函數和他們得到它返回一些像getInputStream()方法

相關問題