在java中的Excel生成问题

我正在尝试使用Apache POI来生成Excel文件。 我的需要是生成120k行和7列的数据。 我可以很容易地生成25000行的Excel文件,但问题是我不能生成100K行的Excel文件。 在运行时代码执行变得缓慢。

为了生成excel文件,系统必须通过for循环(100k行和9列)迭代900k次。
最初在excel对象中添加24行大约需要1秒,然后逐渐降低执行速度。
添加70k行后,需要24..30秒才能添加一行。 为什么发生这种情况?

 List<String[]> keyList = keyService.findAllKeyByBatchCode(batchCode); int x = 1; if(keyList != null && keyList.size() != 0) { Date activated_Date = null; for (int i = 0; i<keyList.size(); i++) { Object[] keyUser = keyList.get(i); data.put(x, new Object[] { String.valueOf(x), keyForDetails.getLicenceType().getName(), batchCode, keyForDetails.getKeyType(), keyUser[0], "", DateUtility.convertUtilDatetoString(keyForDetails.getDate()), String.valueOf(keyForDetails.getPrice()), keyUser[1] }); x++; } } XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("Key sheet"); Set<Integer> keyset = data.keySet(); int rownum = 0; System.out.println("-------------printin------"); try { for (Integer key : keyset) { Row row = sheet.createRow(rownum++); Object [] objArr = data.get(key); int cellnum = 0; for (Object obj : objArr) { System.out.println("-------------print cell------"); Cell cell = row.createCell(cellnum++); if(obj instanceof Date) cell.setCellValue((Date)obj); else if(obj instanceof Boolean) cell.setCellValue((Boolean)obj); else if(obj instanceof String) cell.setCellValue((String)obj); else if(obj instanceof Double) cell.setCellValue((Double)obj); } } if(rownum != 1) { System.out.println("-------------file writein------"); FileOutputStream out = new FileOutputStream(new File("C:/Users/Public/Documents/"+batchCode+" page"+n+".xlsx")); workbook.write(out); out.close(); System.out.println("Excel written successfully.."); } } catch (Exception e) { e.printStackTrace(); } 

Apache-poi有一个streamAPI ,可以处理大量的数据。 从apache POI站点的文档可以看出,自3.8.beta3以来,有一个叫做SXSSF的新API。 它有一个小得多的脚印,应该用来生产非常大的Excel文件。

你可以检查这个链接

您也可以参考以下基本代码:

 public class ReadWriteExcelFile { public static void main(String[] args) throws IOException { String excelFileName = "C:\\temp\\Test.xlsx";//name of excel file String sheetName = "Sheet1";//name of sheet SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk Sheet sheet = wb.createSheet(sheetName); //iterating r number of rows for (int r = 0; r < 55555; r++) { Row row = sheet.createRow(r); //iterating c number of columns for (int c = 0; c < 5; c++) { Cell cell = row.createCell(c); cell.setCellValue("Cell " + r + " " + c); } if ( r % 1000 == 0) { System.out.println(r); } } FileOutputStream out = new FileOutputStream(excelFileName); wb.write(out); out.close(); } }