使用POI将大型结果集写入Excel文件

13 浏览
0 Comments

使用POI将大型结果集写入Excel文件

这种情况与将大型ResultSet写入文件类似,但所讨论的文件是Excel文件。

我正在使用Apache POI库来写入一个Excel文件,其中包含从ResultSet对象中检索到的大型数据集。数据范围可能从几千条记录到大约100万条记录不等;不确定这在Excel格式的文件系统字节中如何转化。

以下是我编写的一个测试代码,用于检查写入这样一个大型结果集所需的时间,以及与CPU和内存相关的性能影响。

protected void writeResultsetToExcelFile(ResultSet rs, int numSheets, String fileNameAndPath) throws Exception {
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileNameAndPath));
    int numColumns = rs.getMetaData().getColumnCount();
    Workbook wb = ExcelFileUtil.createExcelWorkBook(true, numSheets);
    Row heading = wb.getSheetAt(0).createRow(1);
    ResultSetMetaData rsmd = rs.getMetaData();
    for(int x = 0; x < numColumns; x++) {
        Cell cell = heading.createCell(x+1);
        cell.setCellValue(rsmd.getColumnLabel(x+1));
    }
    int rowNumber = 2;
    int sheetNumber = 0;
    while(rs.next()) {
        if(rowNumber == 65001) {
            log("Sheet " + sheetNumber + "written; moving onto to sheet " + (sheetNumber + 1));
            sheetNumber++;
            rowNumber = 2;
        }
        Row row = wb.getSheetAt(sheetNumber).createRow(rowNumber);
        for(int y = 0; y < numColumns; y++) {
            row.createCell(y+1).setCellValue(rs.getString(y+1));
            wb.write(bos);
        }
        rowNumber++;
    }
    //wb.write(bos);
    bos.close();
}

以上代码运行不太顺利。创建的文件似乎迅速增长(每秒约70Mb)。所以我在大约10分钟后停止了执行(当文件达到7Gb时终止了JVM),然后尝试在Excel 2007中打开该文件。我一打开它,文件大小就变成了8k!而且只创建了标题和第一行。不确定我漏掉了什么。

有什么想法吗?

0