POIperformance
我在我的J2EE Web应用程序中使用POI来生成工作簿。 但是,我发现POI需要大约3分钟来创build一个25K行的工作簿(每列大约15列)。 这是一个POI的性能问题,还是花了很多时间是合理的? 是否有其他的API更好的性能?
我会非常惊讶地看到POI花了很多时间来生成这样的文件。 我刚刚在18秒左右生成了一个30000行×10个单元的表单(没有格式化,公平)。 原因可能是下列之一:
- POI日志logging可能会打开,如下所述
- 你从交换内存运行
- 您的虚拟机可用堆可能非常低
如果您使用“stream式”POI API而不是标准POI API,那么使用POI编写大型文件的性能会大大降低。 事实上,默认情况下,POI会在所有的数据一次写完之前保留所有的数据。 对于大文件来说,这个内存占用空间可能非常大。 您可以使用stream媒体API来控制如何使用内存,并逐步将数据写入磁盘。
为了创build一个stream媒体工作簿,使用如下所示:
SXSSFWorkbook book = new SXSSFWorkbook(); book.setCompressTempFiles(true); SXSSFSheet sheet = (SXSSFSheet) book.createSheet(); sheet.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk // ...
如果其他答案都没有解决,看看安迪·汗的JExcel是否会更好。 我发现它远远优于用POI来处理Java中的Excel。
我们也在我们的networking应用中使用POI,并没有任何性能问题 – 尽pipe我们生成的文档比您的要小得多。 我会首先检查POI是否是真正的问题。 尝试生成没有J2EE开销(Unit-Test)的文档并测量性能。 您还可以监视J2EE服务器上的负载和内存使用情况,以查看问题是否来自某些不理想的系统设置。
我已经比较了Apache POI和JExcel库。 看来JExcel比Apache POI快达4倍,但内存消耗似乎差不多:
@Test public void createJExcelWorkbook() throws Exception { WritableWorkbook workbook = Workbook.createWorkbook(new File("jexcel_workbook.xls")); WritableSheet sheet = workbook.createSheet("sheet", 0); for ( int i=0; i < 65535; i++) { for ( int j=0; j < 10; j++) { Label label = new Label(j, i, "some text " + i + " " + j); sheet.addCell(label); } } workbook.write(); workbook.close(); } @Test public void createPoiWorkbook() throws Exception { Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("sheet"); for ( int i=0; i < 65535; i++) { Row row = sheet.createRow(i); for ( int j=0; j < 10; j++) { Cell cell = row.createCell(j); cell.setCellValue("some text " + i + " " + j); } } FileOutputStream fileOut = new FileOutputStream("poi_workbook.xls"); wb.write(fileOut); fileOut.close(); }
我已经使用JExcel 2.6.12和Apache POI 3.7版进行了testing。 您需要自行下载最新的库版本,并运行上面的简单testing以获得更准确的数字。
<dependency org="org.apache.poi" name="poi" rev="3.7"/> <dependency org="net.sourceforge.jexcelapi" name="jxl" rev="2.6.12"/>
注意: Apache POI在每张纸上有65535行的限制。