public void testMCTable_bug46009() { MergedCellsTable mct = new MergedCellsTable(); ArrayList recList = new ArrayList(); CellRangeAddress[] cras = new CellRangeAddress[] { new CellRangeAddress(0, 0, 0, 3), }; recList.Add(new MergeCellsRecord(cras, 0, 1)); RecordStream rs = new RecordStream(recList, 0); mct.Read(rs); try { mct.VisitContainedRecords(dummyRecordVisitor); } catch (Exception) { throw new AssertionException("Identified bug 46009"); } }
private InternalSheet() { _mergedCellsTable = new MergedCellsTable(); records = new List<RecordBase>(32); //if (log.Check(POILogger.DEBUG)) // log.Log(POILogger.DEBUG, "Sheet Createsheet from scratch called"); records.Add(CreateBOF()); records.Add(CreateCalcMode()); records.Add(CreateCalcCount()); records.Add(CreateRefMode()); records.Add(CreateIteration()); records.Add(CreateDelta()); records.Add(CreateSaveRecalc()); records.Add(CreatePrintHeaders()); printGridlines = CreatePrintGridlines(); records.Add(printGridlines); gridset = CreateGridset(); records.Add(gridset); _gutsRecord = CreateGuts(); records.Add(_gutsRecord); defaultrowheight = CreateDefaultRowHeight(); records.Add(defaultrowheight); records.Add(CreateWSBool()); // 'Page Settings Block' _psBlock = new PageSettingsBlock(); records.Add(_psBlock); // 'Worksheet Protection Block' (after 'Page Settings Block' and before DEFCOLWIDTH) records.Add(_protectionBlock); defaultcolwidth = CreateDefaultColWidth(); records.Add(defaultcolwidth); ColumnInfoRecordsAggregate columns = new ColumnInfoRecordsAggregate(); records.Add(columns); _columnInfos = columns; _dimensions = CreateDimensions(); records.Add(_dimensions); _rowsAggregate = new RowRecordsAggregate(); records.Add(_rowsAggregate); // 'Sheet View Settings' records.Add(windowTwo = CreateWindowTwo()); selection = CreateSelection(); records.Add(selection); records.Add(_mergedCellsTable); // MCT comes after 'Sheet View Settings' sheetext = new SheetExtRecord(); records.Add(sheetext); records.Add(EOFRecord.instance); //if (log.Check(POILogger.DEBUG)) // log.Log(POILogger.DEBUG, "Sheet Createsheet from scratch exit"); }
/// <summary> /// Initializes a new instance of the <see cref="InternalSheet"/> class. /// </summary> /// <param name="rs">The stream.</param> private InternalSheet(RecordStream rs) { _mergedCellsTable = new MergedCellsTable(); RowRecordsAggregate rra = null; records = new List<RecordBase>(128); // TODO - take chart streams off into separate java objects //int bofEofNestingLevel = 0; // nesting level can only get to 2 (when charts are present) int dimsloc = -1; if (rs.PeekNextSid() != BOFRecord.sid) { throw new Exception("BOF record expected"); } BOFRecord bof = (BOFRecord)rs.GetNext(); if (bof.Type != BOFRecord.TYPE_WORKSHEET) { // TODO - fix junit tests throw new RuntimeException("Bad BOF record type"); } records.Add(bof); while (rs.HasNext()) { int recSid = rs.PeekNextSid(); if (recSid == CFHeaderRecord.sid) { condFormatting = new ConditionalFormattingTable(rs); records.Add(condFormatting); continue; } if (recSid == ColumnInfoRecord.sid) { _columnInfos = new ColumnInfoRecordsAggregate(rs); records.Add(_columnInfos); continue; } if (recSid == DVALRecord.sid) { _dataValidityTable = new DataValidityTable(rs); records.Add(_dataValidityTable); continue; } if (RecordOrderer.IsRowBlockRecord(recSid)) { //only Add the aggregate once if (rra != null) { throw new InvalidOperationException("row/cell records found in the wrong place"); } RowBlocksReader rbr = new RowBlocksReader(rs); _mergedCellsTable.AddRecords(rbr.LooseMergedCells); rra = new RowRecordsAggregate(rbr.PlainRecordStream, rbr.SharedFormulaManager); records.Add(rra); //only Add the aggregate once continue; } if (CustomViewSettingsRecordAggregate.IsBeginRecord(recSid)) { // This happens three times in test sample file "29982.xls" // Also several times in bugzilla samples 46840-23373 and 46840-23374 records.Add(new CustomViewSettingsRecordAggregate(rs)); continue; } if (PageSettingsBlock.IsComponentRecord(recSid)) { if (_psBlock == null) { // first PSB record encountered - read all of them: _psBlock = new PageSettingsBlock(rs); records.Add(_psBlock); } else { // one or more PSB records found after some intervening non-PSB records _psBlock.AddLateRecords(rs); } // YK: in some cases records can be moved to the preceding // CustomViewSettingsRecordAggregate blocks _psBlock.PositionRecords(records); continue; } if (WorksheetProtectionBlock.IsComponentRecord(recSid)) { _protectionBlock.AddRecords(rs); continue; } if (recSid == MergeCellsRecord.sid) { // when the MergedCellsTable is found in the right place, we expect those records to be contiguous _mergedCellsTable.Read(rs); continue; } if (recSid == BOFRecord.sid) { ChartSubstreamRecordAggregate chartAgg = new ChartSubstreamRecordAggregate(rs); //ChartSheetAggregate chartAgg = new ChartSheetAggregate(rs, null); //if (false) //{ // TODO - would like to keep the chart aggregate packed, but one unit test needs attention // records.Add(chartAgg); //} //else //{ SpillAggregate(chartAgg, records); //} continue; } Record rec = rs.GetNext(); if (recSid == IndexRecord.sid) { // ignore INDEX record because it is only needed by Excel, // and POI always re-calculates its contents continue; } if (recSid == UncalcedRecord.sid) { // don't Add UncalcedRecord to the list _isUncalced = true; // this flag is enough continue; } if (recSid == FeatRecord.sid || recSid == FeatHdrRecord.sid) { records.Add(rec); continue; } if (recSid == EOFRecord.sid) { records.Add(rec); break; } if (recSid == DimensionsRecord.sid) { // Make a columns aggregate if one hasn't Ready been created. if (_columnInfos == null) { _columnInfos = new ColumnInfoRecordsAggregate(); records.Add(_columnInfos); } _dimensions = (DimensionsRecord)rec; dimsloc = records.Count; } else if (recSid == DefaultColWidthRecord.sid) { defaultcolwidth = (DefaultColWidthRecord)rec; } else if (recSid == DefaultRowHeightRecord.sid) { defaultrowheight = (DefaultRowHeightRecord)rec; } else if (recSid == PrintGridlinesRecord.sid) { printGridlines = (PrintGridlinesRecord)rec; } else if (recSid == GridsetRecord.sid) { gridset = (GridsetRecord)rec; } else if (recSid == SelectionRecord.sid) { selection = (SelectionRecord)rec; } else if (recSid == WindowTwoRecord.sid) { windowTwo = (WindowTwoRecord)rec; } else if (recSid == SheetExtRecord.sid) { sheetext = (SheetExtRecord)rec; } else if (recSid == GutsRecord.sid) { _gutsRecord = (GutsRecord)rec; } records.Add(rec); } if (windowTwo == null) { throw new InvalidOperationException("WINDOW2 was not found"); } if (_dimensions == null) { // Excel seems to always write the DIMENSION record, but tolerates when it is not present // in all cases Excel (2007) adds the missing DIMENSION record if (rra == null) { // bug 46206 alludes to files which skip the DIMENSION record // when there are no row/cell records. // Not clear which application wrote these files. rra = new RowRecordsAggregate(); } else { //log.log(POILogger.WARN, "DIMENSION record not found even though row/cells present"); // Not sure if any tools write files like this, but Excel reads them OK } dimsloc = FindFirstRecordLocBySid(WindowTwoRecord.sid); _dimensions = rra.CreateDimensions(); records.Insert(dimsloc, _dimensions); } if (rra == null) { rra = new RowRecordsAggregate(); records.Insert(dimsloc + 1, rra); } _rowsAggregate = rra; // put merged cells table in the right place (regardless of where the first MergedCellsRecord was found */ RecordOrderer.AddNewSheetRecord(records, _mergedCellsTable); RecordOrderer.AddNewSheetRecord(records, _protectionBlock); //if (log.Check(POILogger.DEBUG)) // log.Log(POILogger.DEBUG, "sheet createSheet (existing file) exited"); }
/// <summary> /// Initializes a new instance of the <see cref="Sheet"/> class. /// </summary> /// <param name="rs">The stream.</param> private Sheet(RecordStream rs) { _mergedCellsTable = new MergedCellsTable(); RowRecordsAggregate rra = null; records = new List<RecordBase>(128); // TODO - take chart streams off into separate java objects int bofEofNestingLevel = 0; // nesting level can only get to 2 (when charts are present) int dimsloc = -1; while (rs.HasNext()) { int recSid = rs.PeekNextSid(); if (recSid == CFHeaderRecord.sid) { condFormatting = new ConditionalFormattingTable(rs); records.Add(condFormatting); continue; } if (recSid == ColumnInfoRecord.sid) { _columnInfos = new ColumnInfoRecordsAggregate(rs); records.Add(_columnInfos); continue; } if (recSid == DVALRecord.sid) { _dataValidityTable = new DataValidityTable(rs); records.Add(_dataValidityTable); continue; } if (RecordOrderer.IsRowBlockRecord(recSid) && bofEofNestingLevel == 1) { //only Add the aggregate once if (rra != null) { throw new InvalidOperationException("row/cell records found in the wrong place"); } RowBlocksReader rbr = new RowBlocksReader(rs); _mergedCellsTable.AddRecords(rbr.LooseMergedCells); rra = new RowRecordsAggregate(rbr.PlainRecordStream, rbr.SharedFormulaManager); records.Add(rra); //only Add the aggregate once continue; } if (PageSettingsBlock.IsComponentRecord(recSid)) { PageSettingsBlock psb = new PageSettingsBlock(rs); if (bofEofNestingLevel == 1) { if (_psBlock == null) { _psBlock = psb; } else { // more than one 'Page Settings Block' at nesting level 1 ? // apparently this happens in about 15 test sample files } } records.Add(psb); continue; } if (recSid == MergeCellsRecord.sid) { // when the MergedCellsTable is found in the right place, we expect those records to be contiguous _mergedCellsTable.Read(rs); continue; } Record rec = rs.GetNext(); if (recSid == IndexRecord.sid) { // ignore INDEX record because it is only needed by Excel, // and POI always re-calculates its contents continue; } if (recSid == UncalcedRecord.sid) { // don't Add UncalcedRecord to the list _isUncalced = true; // this flag is enough continue; } if (recSid == BOFRecord.sid) { bofEofNestingLevel++; //if (log.Check(POILogger.DEBUG)) // log.Log(POILogger.DEBUG, "Hit BOF record. Nesting increased to " + bofEofNestingLevel); } else if (recSid == EOFRecord.sid) { --bofEofNestingLevel; //if (log.Check(POILogger.DEBUG)) // log.Log(POILogger.DEBUG, "Hit EOF record. Nesting decreased to " + bofEofNestingLevel); if (bofEofNestingLevel == 0) { records.Add(rec); break; } } else if (recSid == DimensionsRecord.sid) { // Make a columns aggregate if one hasn't Ready been created. if (_columnInfos == null) { _columnInfos = new ColumnInfoRecordsAggregate(); records.Add(_columnInfos); } _dimensions = (DimensionsRecord)rec; dimsloc = records.Count; } else if (recSid == DefaultColWidthRecord.sid) { defaultcolwidth = (DefaultColWidthRecord)rec; } else if (recSid == DefaultRowHeightRecord.sid) { defaultrowheight = (DefaultRowHeightRecord)rec; } else if (recSid == PrintGridlinesRecord.sid) { printGridlines = (PrintGridlinesRecord)rec; } else if (recSid == GridsetRecord.sid) { gridset = (GridsetRecord)rec; } else if (recSid == SelectionRecord.sid) { selection = (SelectionRecord)rec; } else if (recSid == WindowTwoRecord.sid) { windowTwo = (WindowTwoRecord)rec; } else if (recSid == ProtectRecord.sid) { protect = (ProtectRecord)rec; } else if (recSid == ObjectProtectRecord.sid) { objprotect = (ObjectProtectRecord)rec; } else if (recSid == ScenarioProtectRecord.sid) { scenprotect = (ScenarioProtectRecord)rec; } else if (recSid == PasswordRecord.sid) { password = (PasswordRecord)rec; } else if (recSid == SheetExtRecord.sid) { sheetext = (SheetExtRecord)rec; } records.Add(rec); } if (windowTwo == null) { throw new InvalidOperationException("WINDOW2 was not found"); } if (_dimensions == null) { // Excel seems to always write the DIMENSION record, but tolerates when it is not present // in all cases Excel (2007) adds the missing DIMENSION record if (rra == null) { // bug 46206 alludes to files which skip the DIMENSION record // when there are no row/cell records. // Not clear which application wrote these files. rra = new RowRecordsAggregate(); } else { //log.log(POILogger.WARN, "DIMENSION record not found even though row/cells present"); // Not sure if any tools write files like this, but Excel reads them OK } dimsloc = FindFirstRecordLocBySid(WindowTwoRecord.sid); _dimensions = rra.CreateDimensions(); records.Insert(dimsloc, _dimensions); } if (rra == null) { rra = new RowRecordsAggregate(); records.Insert(dimsloc + 1, rra); } _rowsAggregate = rra; // put merged cells table in the right place (regardless of where the first MergedCellsRecord was found */ RecordOrderer.AddNewSheetRecord(records, _mergedCellsTable); //if (log.Check(POILogger.DEBUG)) // log.Log(POILogger.DEBUG, "sheet createSheet (existing file) exited"); }