2017-07-25 69 views
1

我遇到問題了解如何打開現有的excel文件,向其中添加數據,將該文件輸出到瀏覽器,然後關閉工作簿保存對它的任何更改。Apache POI - 如何在Grails應用程序中提供excel文件供下載

以前我用它來創建工作簿:

workbook = new XSSFWorkbook(new FileInputStream(file)) 

這給它輸出到瀏覽器:

workbook.write(response.outputStream) 

不過,我也陷入了內存問題,所以我從的FileInputStream改變在WorkbookFactory:

workbook = WorkbookFactory.create(file) 

然而,這似乎修改文件(儘管它似乎沒有實際編輯任何東西)。我嘗試使用重載函數以只讀標誌按this SO post

workbook = WorkbookFactory.create(file,null,true) 

但是我不能用workbook.write()了,因爲它抱怨說,該文件是隻讀的。任何人都可以向我解釋這樣做的正確程序嗎?使用workbookFactory解決了我的內存問題,但我不喜歡它以某種方式修改了excel文件。

+0

問題是**如何**使用'File'而不是'FileInputStream'來減少內存佔用。使用'File'直接從文件打開'* .xlsx'' ZipPackage'。所以不是整個'ZIP'內容必須加載到內存中。但是,當然,關閉'ZipPackage'將會改變下層文件的最後修改參數,儘管文件的內容不會被改變。 –

+0

@AxelRichter我明白了。我想,只要文件沒有改變,我很好,我只是緊張,因爲我需要該文件的單元格內容保持不變。我會研究Tuyens的建議以及最終值得的結果。感謝你們倆! –

+0

我不知道是否可以保存文件內容永遠不會在以後的'apachwe poi'版本中更改。我懷疑使用文件而不是輸入流的主要目標是**不減少內存佔用,但有一個文件可以在關閉後將更改存儲到自身中。這只是到現在才完全實施。我的懷疑是因爲在二進制格式('* .xls *''BIFF')中打開一個隨機訪問文件,而使用文件而不是輸入流。 –

回答

0

隨着WorkbookFactory你只能打開一個現有的文件,你用它做的任何過程導致修改它。你的問題是你不想修改你的文件,所以我建議給你一個解決方案:製作原始文件副本=>在副本上工作(做任何你想做的事情)=>完成後刪除這個副本你的工作。

+1

問題不在於'WorkbookFactory',而是使用'File'而不是'FileInputStream'。如果'WorkbookFactory'使用'FileInputStream',那麼問題就不會發生。但你的建議很好。 –

相關問題