我正在尝试使用POI库生成包含近13000行和3列的.xls文件。但是生成完整的文件需要大约8-10分钟。任何人都可以建议我如何减少执行时间?
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());
}
答案 0 :(得分:2)
使用制表符或逗号作为分隔符生成字符分隔值文件(csv)会快得多。使用.csv
扩展名保存文件。
Excel可以非常快速地阅读这些文件。
答案 1 :(得分:1)
根据我的经验,我发现POI对于阅读Excel文件非常有用,但在生成它们时却耗费时间和内存消耗。我可以为您提供3种选择:
1)通过您使用的课程(HSSF *),我认为您可能正在使用旧版本的POI。我建议你切换到最新版本,看看是否有任何改进。由于代码更改很少,您甚至可以获得生成.xls和.xlsx格式的代码版本,因此您可以分析两个选项(假设您可以生成除.xls之外的任何其他格式) - 编辑:我最近有过有机会测试SXSSF性能,并且在内存和速度方面都具有出色性能
2)正如其他人所建议的那样,生成.csv会快得多,但你会丢失任何格式(假设你可以生成.xls以外的格式)
3)如果您可以使用与.xls不同的格式,我建议您查看Excel XML电子表格格式。我们多年来一直在使用它,我们不得不工作自己的格式实现。但是,如果您愿意投入一两天来实施它,那么您的实施应该比POI在时间和内存使用方面更有效。
http://msdn.microsoft.com/en-us/library/office/aa140066%28v=office.10%29.aspx