2017-07-25 68 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',那么问题就不会发生。但你的建议很好。 –

相关问题