public void AddMultipleBlanks(MulBlankRecord mbr) { for (int j = 0; j < mbr.NumColumns; j++) { BlankRecord br = new BlankRecord(); br.Column = j + mbr.FirstColumn; br.Row = mbr.Row; br.XFIndex = (mbr.GetXFAt(j)); InsertCell(br); } }
public void VisitRecord(Record r) { if (r is MulBlankRecord) { MulBlankRecord mbr = (MulBlankRecord)r; bs.countMulBlankRecords++; bs.countBlankCells += mbr.NumColumns; } else if (r is BlankRecord) { bs.countSingleBlankRecords++; bs.countBlankCells++; } }
/// <summary> /// Process an HSSF Record. Called when a record occurs in an HSSF file. /// </summary> /// <param name="record"></param> public void ProcessRecord(Record record) { int thisRow; int thisColumn; CellValueRecordInterface[] expandedRecords = null; if (record is CellValueRecordInterface) { CellValueRecordInterface valueRec = (CellValueRecordInterface)record; thisRow = valueRec.Row; thisColumn = valueRec.Column; } else { thisRow = -1; thisColumn = -1; switch (record.Sid) { // the BOFRecord can represent either the beginning of a sheet or the workbook case BOFRecord.sid: BOFRecord bof = (BOFRecord)record; if (bof.Type == BOFRecord.TYPE_WORKBOOK || bof.Type == BOFRecord.TYPE_WORKSHEET) { // Reset the row and column counts - new workbook / worksheet ResetCounts(); } break; case RowRecord.sid: RowRecord rowrec = (RowRecord)record; //Console.WriteLine("Row " + rowrec.RowNumber + " found, first column at " // + rowrec.GetFirstCol() + " last column at " + rowrec.GetLastCol()); // If there's a jump in rows, fire off missing row records if (lastRowRow + 1 < rowrec.RowNumber) { for (int i = (lastRowRow + 1); i < rowrec.RowNumber; i++) { MissingRowDummyRecord dr = new MissingRowDummyRecord(i); childListener.ProcessRecord(dr); } } // Record this as the last row we saw lastRowRow = rowrec.RowNumber; 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.Row; thisColumn = nrec.Column; break; default: //Console.WriteLine(record.GetClass()); break; } } // First part of expanded record handling if (expandedRecords != null && expandedRecords.Length > 0) { thisRow = expandedRecords[0].Row; thisColumn = expandedRecords[0].Column; } // 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 && lastCellRow > -1) { 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].Column; } // 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) { foreach (CellValueRecordInterface r in expandedRecords) { childListener.ProcessRecord((Record)r); } } else { childListener.ProcessRecord(record); } }
private Biff GetCorrectRecord(GenericBiff record, Stream stream, SstRecord sst) { Biff ret = record; switch (record.Id) { case (ushort)RecordType.Bof: BofRecord bof = new BofRecord(record); if (bof.Version < 0x0600) { throw new Exception("Versions below Excel 97/2000 are currently not supported."); } ret = bof; break; case (ushort)RecordType.Boundsheet: ret = new BoundSheetRecord(record); break; case (ushort)RecordType.Index: ret = new IndexRecord(record); break; case (ushort)RecordType.DbCell: ret = new DbCellRecord(record); break; case (ushort)RecordType.Row: ret = new RowRecord(record); break; case (ushort)RecordType.Continue: ret = new ContinueRecord(record); break; case (ushort)RecordType.Blank: ret = new BlankRecord(record); break; case (ushort)RecordType.BoolErr: ret = new BoolErrRecord(record); break; case (ushort)RecordType.Formula: ret = new FormulaRecord(record, stream); break; case (ushort)RecordType.Label: ret = new LabelRecord(record); break; case (ushort)RecordType.LabelSst: ret = new LabelSstRecord(record, sst); break; case (ushort)RecordType.MulBlank: ret = new MulBlankRecord(record); break; case (ushort)RecordType.MulRk: ret = new MulRkRecord(record); break; case (ushort)RecordType.String: ret = new StringValueRecord(record); break; case (ushort)RecordType.Xf: ret = new XfRecord(record); break; case (ushort)RecordType.Rk: ret = new RkRecord(record); break; case (ushort)RecordType.Number: ret = new NumberRecord(record); break; case (ushort)RecordType.Array: ret = new ArrayRecord(record); break; case (ushort)RecordType.ShrFmla: ret = new SharedFormulaRecord(record); break; case (ushort)RecordType.Table: ret = new TableRecord(record); break; case (ushort)RecordType.Sst: ret = new SstRecord(record, stream); break; case (ushort)RecordType.Eof: ret = new EofRecord(record); break; case (ushort)RecordType.Font: ret = new FontRecord(record); break; case (ushort)RecordType.Format: ret = new Net.SourceForge.Koogra.Excel.Records.FormatRecord(record); break; case (ushort)RecordType.Palette: ret = new PaletteRecord(record); break; case (ushort)RecordType.Hyperlink: ret = new HyperLinkRecord(record); break; } return(ret); }