我在我的Web服务器上构建了一个非常大的POI工作簿.将整个工作簿保存在内存中,不会扩展多个并发请求.有没有办法可以逐步将工作簿写入servlet输出流.这应该减少响应时间,并使进程内存有效.
如果您要生成Excel 2007(xslx),那么您可以调整BigGridDemo.java的方法,如下所述:http://web.archive.org/web/20110821054135/http: //www.realdevelopers.com/blog /代码/ EXCEL
解决方案是让POI仅生成容器xslx作为模板,并将实际的电子表格数据作为XML流式传输到zip输出流中.因此,简化XML生成将取决于您.
自从编写了其余答案以来,情况已大大改善-流技术现在已成为Apache Poi的一部分。
请参阅SXSSFWorkbook类和此处的文档。它在工作表上使用流式窗口,将窗口外的旧行刷新为临时文件。
这基于hlg的答案中BigGridDemo
使用的方法,但现在已成为官方发行版的一部分。
这是文档中的示例:
public static void main(String[] args) throws Throwable { // keep 100 rows in memory, exceeding rows will be flushed to disk SXSSFWorkbook wb = new SXSSFWorkbook(100); Sheet sh = wb.createSheet(); for(int rownum = 0; rownum < 1000; rownum++){ Row row = sh.createRow(rownum); for(int cellnum = 0; cellnum < 10; cellnum++){ Cell cell = row.createCell(cellnum); String address = new CellReference(cell).formatAsString(); cell.setCellValue(address); } } // Rows with rownum < 900 are flushed and not accessible for(int rownum = 0; rownum < 900; rownum++){ Assert.assertNull(sh.getRow(rownum)); } // ther last 100 rows are still in memory for(int rownum = 900; rownum < 1000; rownum++){ Assert.assertNotNull(sh.getRow(rownum)); } FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx"); wb.write(out); out.close(); // dispose of temporary files backing this workbook on disk wb.dispose(); }