2011-07-05 191 views
1

使用Apache POI HSSF,我們可以創建這樣Apache POI - 如何將XSSFWorkbook寫入POIFSFileSystem?

private void write(HSSFWorkbook workbook) { 
    POIFSFileSystem filesystem = new POIFSFileSystem(); 
    filesystem.createDocument(new ByteArrayInputStream(workbook.getBytes()), 
        "Workbook"); 
    FileOutputStream stream = new FileOutputStream("test.xls"); 
    filesystem.writeFilesystem(stream); 
} 

同樣xls文件,我怎麼能寫有XSSFWorkbook?這沒有getBytes()方法。
我試圖從XSSFWorkbook這樣創建ByteArrayInputStream -

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
workbook.write(baos); //XSSFWorkbook here 
ByteArrayInputStream bias = new ByteArrayInputStream(baos.toByteArray()); 

但創建的XLSX文件已損壞。如何使用POIFSFileSystem將工作簿寫入光盤?

同樣XSSFWorkbook被成功地寫時,我做了這樣的 -

FileOutputStream stream = new FileOutputStream("test.xlsx"); 
workbook.write(stream); 

當我提取並比較了XLSX文件,沒有什麼區別。但是,當我直接對xlsx文件進行純文本比較(無需解壓縮)時,幾乎沒有差異。

所以問題應該在POIFSFileSystemcreateDocument()和/或writeFilesystem()方法中。有人可以讓我知道如何使用POIFSFileSystemXSSFWorkbook

回答

4

你不能!

POIFSFileSystem可以與OLE2文件一起使用,例如.xls,.doc,.ppt,.msg等。POIFS代碼處理讀取和寫入內容中的單個流。

隨着OOXML文件(.xlsx,.docx,.pptx等),該文件的容器不再是OLE2。相反,這些文件存儲在Zip容器中。在POI中,這由OPCPackage來處理,OPCPackage負責從Zip文件讀取和寫入所需的OOXML元數據。

如果你想要寫一個XSSF文件保存到磁盤,簡單地做:

FileOutputStream stream = new FileOutputStream("test.xlsx"); 
workbook.write(stream); 
stream.close(); 

而且XSSFWorkbook將處理交談OPCPackage爲你做到這一點。