大型Excel工作表生成优化

我正在尝试使用POI库生成一个包含近13000行和3列的.xls文件。 但是这需要将近8-10分钟才能生成完整的文件。 任何人都可以build议如何减less执行时间?

public static void generateReconReport(Connection con,String neName,String reportTable) throws SQLException, IOException{ Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); String sql = "SELECT * FROM "+reportTable; ResultSet rsNERecon = stmt.executeQuery(sql); System.out.println("Resulset obtained, Generating Report"); Date date = new Date(); SimpleDateFormat sid = new SimpleDateFormat("MMddyyyy"); String curDate = sid.format(date); String fileName = neName.toUpperCase()+"_" + curDate + ".xlsx"; File ob_file = new File(fileName); if(!ob_file.exists()) ob_file.createNewFile(); HSSFWorkbook hsfWb = new HSSFWorkbook(); HSSFSheet hsfSheet = hsfWb.createSheet(neName.toUpperCase()+" Recon Report"); HSSFRow hsfRow = hsfSheet.createRow(0); ResultSetMetaData metaRs = rsNERecon.getMetaData(); int colCount = metaRs.getColumnCount(); for (int j = 1; j <= colCount; j++) { String colName = metaRs.getColumnName(j); hsfRow.createCell(j).setCellValue(colName); } FileOutputStream fileOut = new FileOutputStream(fileName); int rowNum = 1; while (rsNERecon.next()) { hsfRow = hsfSheet.createRow(rowNum); for (int j = 1; j <= colCount; j++) hsfRow.createCell(j).setCellValue(rsNERecon.getString(j)); rowNum++; } for (int j = 1; j <= colCount; j++) hsfSheet.autoSizeColumn(j); rsNERecon.close(); stmt.close(); hsfWb.write(fileOut); fileOut.close(); System.out.println("Report generated for "+neName.toUpperCase()); } 

使用制表符或逗号作为分隔符来生成字符分隔值文件(csv)会快得多。 用.csv扩展名保存文件。

Excel很快读取这些文件。

根据我的经验,我发现POI对于读取Excel文件非常有用,但是在生成Excel文件时却耗费了相当多的时间和内存。 我可以为您提供3个选项:

1)通过您使用的课​​程(HSSF *),我想您可能会使用旧版本的POI。 我build议你切换到最新版本,看看是否有任何改善。 只需很less的代码更改,您甚至可以获得生成.xls和.xlsx格式的代码版本,因此您可以对两个选项进行概要分析(假设您可以生成除.xls之外的任何其他格式) – EDITED:我最近有机会testingSXSSF的性能,并且在内存和速度方面都有很好的performance

2)正如其他人所build议的,生成一个.csv会更快,但是你会失去任何格式(假设你可以生成.xls以外的格式)

3)如果您可以使用与.xls不同的格式,我build议您查看Excel XML Spreadsheet格式。 我们已经使用了好几年了,垮台的是我们不得不自己执行这个格式。 然而,如果你愿意投入一两天的时间来实现它,你的实现应该比POI在时间和内存使用方面更有效率。

http://msdn.microsoft.com/en-us/library/office/aa140066%28v=office.10%29.aspx