我遇到问题了解如何打开现有的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文件。
问题是**如何**使用'File'而不是'FileInputStream'来减少内存占用。使用'File'直接从文件打开'* .xlsx'' ZipPackage'。所以不是整个'ZIP'内容必须加载到内存中。但是,当然,关闭'ZipPackage'将会改变下层文件的最后修改参数,尽管文件的内容不会被改变。 –
@AxelRichter我明白了。我想,只要文件没有改变,我很好,我只是紧张,因为我需要该文件的单元格内容保持不变。我会研究Tuyens的建议以及最终值得的结果。感谢你们俩! –
我不知道是否可以保存文件内容永远不会在以后的'apachwe poi'版本中更改。我怀疑使用文件而不是输入流的主要目标是**不减少内存占用,但有一个文件可以在关闭后将更改存储到自身中。这只是到现在才完全实施。我的怀疑是因为在二进制格式('* .xls *''BIFF')中打开一个随机访问文件,而使用文件而不是输入流。 –