Search code examples
javajdbcapache-poisxssf

Apache POI SXSSF Shows NullPointerException on flush rows


I have 500 rows in my table. When I'm using setRandomAccessWindowSize(1000) it's working fine. Data is exported successfully in Excel file from resultset, But when I use setRandomAccessWindowSize(100) it is giving me a NullPointerException I don't know what I'm doing wrong. Please suggest proper way to do this.

Here's my code:

workbook = new SXSSFWorkbook(100);      //SXSSF workbook
workbook.setCompressTempFiles(true);
SXSSFSheet spreadsheet = workbook.createSheet("Sheet1");     //Generating Excel file
SXSSFRow row;
SXSSFCell cell;
CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();//Create font
font.setBold(true);//Make font bold
style.setFont(font);//set it to bold

int y = 1;
if (rs.isBeforeFirst() == true) {
    while (rs.next()) {
        row = spreadsheet.createRow(0);
        cell = row.createCell(0);
        cell.setCellValue("SR NO");
        cell.setCellStyle(style);
        for (int s = 1; s <= rsmd.getColumnCount(); s++) {
            cell = row.createCell(s);
            cell.setCellValue(rs.getMetaData().getColumnName(+s).toUpperCase());
            cell.setCellStyle(style);
        }
        row = spreadsheet.createRow(y);
        cell = row.createCell(0);
        cell.setCellValue(y + "");
        //spreadsheet.autoSizeColumn(0);
        for (int x = 1; x <= rsmd.getColumnCount(); x++) {
            cell = row.createCell(x);
            String address = new CellReference(cell).formatAsString();
            cell.setCellValue(address);
            cell.setCellValue(rs.getString(+x));
            //spreadsheet.autoSizeColumn(x);
        }
        y++;
    }

    FileOutputStream out = new FileOutputStream(new File(destination));
    workbook.write(out);
    out.close();
    workbook.dispose();

Solution

  • I have updated while loop in above code. It was writing 0th row multiple times. That's why on 101th row it was giving NullPointer exception as 0th row is already flushed.

    Here's my fix-

    if (rs.isBeforeFirst() == true) {
        while (rs.next()) {
            //writing columns
            if (rs.isFirst()) {
                row = spreadsheet.createRow(0);
                cell = row.createCell(0);
                cell.setCellValue("SR NO");
                cell.setCellStyle(style);
                for (int s = 1; s <= rsmd.getColumnCount(); s++) {
                    cell = row.createCell(s);
                    cell.setCellValue(rs.getMetaData().getColumnName(+s).toUpperCase());
                    cell.setCellStyle(style);
                }
            }
            //Writing data
            row = spreadsheet.createRow(y);
            cell = row.createCell(0);
            cell.setCellValue(y + "");
            //spreadsheet.autoSizeColumn(0);
            for (int x = 1; x <= rsmd.getColumnCount(); x++) {
                cell = row.createCell(x);
                cell.setCellValue(rs.getString(+x));
                //spreadsheet.autoSizeColumn(x);
            }
            y++;
        }
    
        FileOutputStream out = new FileOutputStream(new File(destination));
        workbook.write(out);
        out.close();
        workbook.dispose();