public void processRecord()

in poi/src/main/java/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java [65:202]


    public void processRecord(org.apache.poi.hssf.record.Record record) {
        int thisRow;
        int thisColumn;
        CellValueRecordInterface[] expandedRecords = null;

        if (record instanceof CellValueRecordInterface) {
            CellValueRecordInterface valueRec = (CellValueRecordInterface) record;
            thisRow = valueRec.getRow();
            thisColumn = valueRec.getColumn();
        } else {
            if (record instanceof StringRecord){
                //it contains only cashed result of the previous FormulaRecord evaluation
                childListener.processRecord(record);
                return;
            }
            thisRow = -1;
            thisColumn = -1;

            switch (record.getSid()) {
                // the BOFRecord can represent either the beginning of a sheet or
                // the workbook
                case BOFRecord.sid:
                    BOFRecord bof = (BOFRecord) record;
                    if (bof.getType() == BOFRecord.TYPE_WORKBOOK || 
                            bof.getType() == BOFRecord.TYPE_WORKSHEET) {
                        // Reset the row and column counts - new workbook / worksheet
                        resetCounts();
                    }
                    break;
                case RowRecord.sid:
                    RowRecord rowrec = (RowRecord) record;

                    // If there's a jump in rows, fire off missing row records
                    if (lastRowRow + 1 < rowrec.getRowNumber()) {
                        for (int i = (lastRowRow + 1); i < rowrec.getRowNumber(); i++) {
                            MissingRowDummyRecord dr = new MissingRowDummyRecord(i);
                            childListener.processRecord(dr);
                        }
                    }

                    // Record this as the last row we saw
                    lastRowRow = rowrec.getRowNumber();
                    lastCellColumn = -1;
                    break;

                case SharedFormulaRecord.sid:
                    // SharedFormulaRecord occurs after the first FormulaRecord of the cell range.
                    // There are probably (but not always) more cell records after this
                    // - so don't fire off the LastCellOfRowDummyRecord yet
                    childListener.processRecord(record);
                    return;
                case MulBlankRecord.sid:
                    // These appear in the middle of the cell records, to
                    //  specify that the next bunch are empty but styled
                    // Expand this out into multiple blank cells
                    MulBlankRecord mbr = (MulBlankRecord)record;
                    expandedRecords = RecordFactory.convertBlankRecords(mbr);
                    break;
                case MulRKRecord.sid:
                    // This is multiple consecutive number cells in one record
                    // Exand this out into multiple regular number cells
                    MulRKRecord mrk = (MulRKRecord)record;
                    expandedRecords = RecordFactory.convertRKRecords(mrk);
                    break;
                case NoteRecord.sid:
                    NoteRecord nrec = (NoteRecord) record;
                    thisRow = nrec.getRow();
                    thisColumn = nrec.getColumn();
                    break;
                default:
                    break;
            }
        }

        // First part of expanded record handling
        if(expandedRecords != null && expandedRecords.length > 0) {
            thisRow = expandedRecords[0].getRow();
            thisColumn = expandedRecords[0].getColumn();
        }

        // If we're on cells, and this cell isn't in the same
        //  row as the last one, then fire the
        //  dummy end-of-row records
        if(thisRow != lastCellRow && thisRow > 0) {
            if (lastCellRow == -1) lastCellRow = 0;
            for(int i=lastCellRow; i<thisRow; i++) {
                int cols = -1;
                if(i == lastCellRow) {
                    cols = lastCellColumn;
                }
                childListener.processRecord(new LastCellOfRowDummyRecord(i, cols));
            }
        }

        // If we've just finished with the cells, then fire the
        // final dummy end-of-row record
        if(lastCellRow != -1 && lastCellColumn != -1 && thisRow == -1) {
            childListener.processRecord(new LastCellOfRowDummyRecord(lastCellRow, lastCellColumn));

            lastCellRow = -1;
            lastCellColumn = -1;
        }

        // If we've moved onto a new row, the ensure we re-set
        //  the column counter
        if(thisRow != lastCellRow) {
            lastCellColumn = -1;
        }

        // If there's a gap in the cells, then fire
        //  the dummy cell records
        if(lastCellColumn != thisColumn-1) {
            for(int i=lastCellColumn+1; i<thisColumn; i++) {
                childListener.processRecord(new MissingCellDummyRecord(thisRow, i));
            }
        }

        // Next part of expanded record handling
        if(expandedRecords != null && expandedRecords.length > 0) {
            thisColumn = expandedRecords[expandedRecords.length-1].getColumn();
        }


        // Update cell and row counts as needed
        if(thisColumn != -1) {
            lastCellColumn = thisColumn;
            lastCellRow = thisRow;
        }

        // Pass along the record(s)
        if(expandedRecords != null && expandedRecords.length > 0) {
            for(CellValueRecordInterface r : expandedRecords) {
                childListener.processRecord((org.apache.poi.hssf.record.Record)r);
            }
        } else {
            childListener.processRecord(record);
        }
    }