示例#1
0
        // TODO make this class into a record aggregate

        private static ExternSheetRecord ReadExtSheetRecord(RecordStream rs)
        {
            List <ExternSheetRecord> temp = new List <ExternSheetRecord>(2);

            while (rs.PeekNextClass() == typeof(ExternSheetRecord))
            {
                temp.Add((ExternSheetRecord)rs.GetNext());
            }

            int nItems = temp.Count;

            if (nItems < 1)
            {
                throw new Exception("Expected an EXTERNSHEET record but got ("
                                    + rs.PeekNextClass().Name + ")");
            }
            if (nItems == 1)
            {
                // this is the normal case. There should be just one ExternSheetRecord
                return(temp[0]);
            }
            // Some apps generate multiple ExternSheetRecords (see bug 45698).
            // It seems like the best thing to do might be to combine these into one
            ExternSheetRecord[] esrs = new ExternSheetRecord[nItems];
            esrs = temp.ToArray();
            return(ExternSheetRecord.Combine(esrs));
        }
 public ChartSubstreamRecordAggregate(RecordStream rs)
 {
     _bofRec = (BOFRecord)rs.GetNext();
     List<RecordBase> temp = new List<RecordBase>();
     while (rs.PeekNextClass() != typeof(EOFRecord))
     {
         Type a = rs.PeekNextClass();
         if (PageSettingsBlock.IsComponentRecord(rs.PeekNextSid()))
         {
             if (_psBlock != null)
             {
                 if (rs.PeekNextSid() == HeaderFooterRecord.sid)
                 {
                     // test samples: 45538_classic_Footer.xls, 45538_classic_Header.xls
                     _psBlock.AddLateHeaderFooter((HeaderFooterRecord)rs.GetNext());
                     continue;
                 }
                 throw new InvalidDataException(
                         "Found more than one PageSettingsBlock in chart sub-stream");
             }
             _psBlock = new PageSettingsBlock(rs);
             temp.Add(_psBlock);
             continue;
         }
         temp.Add(rs.GetNext());
     }
     _recs = temp;
     Record eof = rs.GetNext(); // no need to save EOF in field
     if (!(eof is EOFRecord))
     {
         throw new InvalidOperationException("Bad chart EOF");
     }
 }
示例#3
0
        // TODO make this class into a record aggregate

        private static ExternSheetRecord ReadExtSheetRecord(RecordStream rs)
        {
            List<ExternSheetRecord> temp = new List<ExternSheetRecord>(2);
            while (rs.PeekNextClass() == typeof(ExternSheetRecord))
            {
                temp.Add((ExternSheetRecord)rs.GetNext());
            }

            int nItems = temp.Count;
            if (nItems < 1)
            {
                throw new Exception("Expected an EXTERNSHEET record but got ("
                        + rs.PeekNextClass().Name + ")");
            }
            if (nItems == 1)
            {
                // this is the normal case. There should be just one ExternSheetRecord
                return temp[0];
            }
            // Some apps generate multiple ExternSheetRecords (see bug 45698).
            // It seems like the best thing to do might be to combine these into one
            ExternSheetRecord[] esrs = new ExternSheetRecord[nItems];
            esrs = temp.ToArray();
            return ExternSheetRecord.Combine(esrs);
        }
示例#4
0
        private WorkbookRecordList _workbookRecordList; // TODO - would be nice to Remove this

        public LinkTable(List <Record> inputList, int startIndex, WorkbookRecordList workbookRecordList)
        {
            _workbookRecordList = workbookRecordList;
            RecordStream rs = new RecordStream(inputList, startIndex);

            ArrayList temp = new ArrayList();

            while (rs.PeekNextClass() == typeof(SupBookRecord))
            {
                temp.Add(new ExternalBookBlock(rs));
            }

            //_externalBookBlocks = new ExternalBookBlock[temp.Count];
            _externalBookBlocks = (ExternalBookBlock[])temp.ToArray(typeof(ExternalBookBlock));
            temp.Clear();

            if (_externalBookBlocks.Length > 0)
            {
                // If any ExternalBookBlock present, there is always 1 of ExternSheetRecord
                if (rs.PeekNextClass() != typeof(ExternSheetRecord))
                {
                    // not quite - if written by google docs
                    _externSheetRecord = null;
                }
                else
                {
                    _externSheetRecord = ReadExtSheetRecord(rs);
                }
            }
            else
            {
                _externSheetRecord = null;
            }

            _definedNames = new List <NameRecord>();
            // collect zero or more DEFINEDNAMEs id=0x18
            while (rs.PeekNextClass() == typeof(NameRecord))
            {
                NameRecord nr = (NameRecord)rs.GetNext();
                _definedNames.Add(nr);
            }

            _recordCount = rs.GetCountRead();
            for (int i = startIndex; i < startIndex + _recordCount; i++)
            {
                _workbookRecordList.Records.Add(inputList[i]);
            }
        }
示例#5
0
        public void TestAbnormalPivotTableRecords_bug46280()
        {
            int SXVIEW_SID = ViewDefinitionRecord.sid;
            Record[] inRecs = {
			new RowRecord(0),
			new NumberRecord(),
			// normally MSODRAWING(0x00EC) would come here before SXVIEW
			new UnknownRecord(SXVIEW_SID, System.Text.Encoding.UTF8.GetBytes("dummydata (SXVIEW: View DefInition)")),
			new WindowTwoRecord(),
		};
            RecordStream rs = new RecordStream(Arrays.AsList(inRecs), 0);
            RowBlocksReader rbr = new RowBlocksReader(rs);
            if (rs.PeekNextClass() == typeof(WindowTwoRecord))
            {
                // Should have stopped at the SXVIEW record
                throw new AssertionException("Identified bug 46280b");
            }
            RecordStream rbStream = rbr.PlainRecordStream;
            Assert.AreEqual(inRecs[0], rbStream.GetNext());
            Assert.AreEqual(inRecs[1], rbStream.GetNext());
            Assert.IsFalse(rbStream.HasNext());
            Assert.IsTrue(rs.HasNext());
            Assert.AreEqual(inRecs[2], rs.GetNext());
            Assert.AreEqual(inRecs[3], rs.GetNext());
        }
示例#6
0
        public void TestAbnormalPivotTableRecords_bug46280()
        {
            int SXVIEW_SID = ViewDefinitionRecord.sid;

            Record[] inRecs =
            {
                new RowRecord(0),
                new NumberRecord(),
                // normally MSODRAWING(0x00EC) would come here before SXVIEW
                new UnknownRecord(SXVIEW_SID,System.Text.Encoding.UTF8.GetBytes("dummydata (SXVIEW: View DefInition)")),
                new WindowTwoRecord(),
            };
            RecordStream    rs  = new RecordStream(Arrays.AsList(inRecs), 0);
            RowBlocksReader rbr = new RowBlocksReader(rs);

            if (rs.PeekNextClass() == typeof(WindowTwoRecord))
            {
                // Should have stopped at the SXVIEW record
                throw new AssertFailedException("Identified bug 46280b");
            }
            RecordStream rbStream = rbr.PlainRecordStream;

            Assert.AreEqual(inRecs[0], rbStream.GetNext());
            Assert.AreEqual(inRecs[1], rbStream.GetNext());
            Assert.IsFalse(rbStream.HasNext());
            Assert.IsTrue(rs.HasNext());
            Assert.AreEqual(inRecs[2], rs.GetNext());
            Assert.AreEqual(inRecs[3], rs.GetNext());
        }
示例#7
0
 public ChartSheetAggregate(RecordStream rs, ChartRecordAggregate container)
     : base(RuleName_CHARTSHEET, container)
 {
     _bofRec = (BOFRecord)rs.GetNext();
     List<RecordBase> temp = new List<RecordBase>();
     while (rs.PeekNextClass() != typeof(EOFRecord))
     {
         Type a = rs.PeekNextClass();
         if (PageSettingsBlock.IsComponentRecord(rs.PeekNextChartSid()))
         {
             if (_psBlock != null)
             {
                 if (rs.PeekNextChartSid() == HeaderFooterRecord.sid)
                 {
                     // test samples: 45538_classic_Footer.xls, 45538_classic_Header.xls
                     _psBlock.AddLateHeaderFooter((HeaderFooterRecord)rs.GetNext());
                     continue;
                 }
                 throw new InvalidDataException(
                         "Found more than one PageSettingsBlock in chart sub-stream");
             }
             _psBlock = new PageSettingsBlock(rs);
             temp.Add(_psBlock);
             continue;
         }
         if (rs.PeekNextChartSid() == ChartRecord.sid)
         {
             chartFormats = new ChartFormatsAggregate(rs, this);
             temp.Add(chartFormats);
             continue;
         }
         if (rs.PeekNextChartSid() == DimensionsRecord.sid)
         {
             seriesData = new SeriesDataAggregate(rs);
             temp.Add(seriesData);
             continue;
         }
         temp.Add(rs.GetNext());
     }
     _recs = temp;
     Record eof = rs.GetNext(); // no need to save EOF in field
     if (!(eof is EOFRecord))
     {
         throw new InvalidOperationException("Bad chart EOF");
     }
 }
 public ConditionalFormattingTable(RecordStream rs)
 {
     IList temp = new ArrayList();
     while (rs.PeekNextClass() == typeof(CFHeaderRecord))
     {
         temp.Add(CFRecordsAggregate.CreateCFAggregate(rs));
     }
     _cfHeaders = temp;
 }
 public DataValidityTable(RecordStream rs)
 {
     _headerRec = (DVALRecord)rs.GetNext();
     IList temp = new ArrayList();
     while (rs.PeekNextClass() == typeof(DVRecord))
     {
         temp.Add(rs.GetNext());
     }
     _validationList = temp;
 }
示例#10
0
            public ExternalBookBlock(RecordStream rs)
            {
                _externalBookRecord = (SupBookRecord)rs.GetNext();
                ArrayList temp = new ArrayList();

                while (rs.PeekNextClass() == typeof(ExternalNameRecord))
                {
                    temp.Add(rs.GetNext());
                }
                _externalNameRecords = (ExternalNameRecord[])temp.ToArray(typeof(ExternalNameRecord));

                temp.Clear();

                while (rs.PeekNextClass() == typeof(CRNCountRecord))
                {
                    temp.Add(new CRNBlock(rs));
                }
                _crnBlocks = (CRNBlock[])temp.ToArray(typeof(CRNBlock));
            }
示例#11
0
 /**
  * Reads zero or more consecutive {@link MergeCellsRecord}s
  * @param rs
  */
 public void Read(RecordStream rs)
 {
     IList temp = _mergedRegions;
     while (rs.PeekNextClass() == typeof(MergeCellsRecord))
     {
         MergeCellsRecord mcr = (MergeCellsRecord)rs.GetNext();
         int nRegions = mcr.NumAreas;
         for (int i = 0; i < nRegions; i++)
         {
             temp.Add(mcr.GetAreaAt(i));
         }
     }
 }
示例#12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ColumnInfoRecordsAggregate"/> class.
 /// </summary>
 /// <param name="rs">The rs.</param>
 public ColumnInfoRecordsAggregate(RecordStream rs): this()
 {
     bool isInOrder = true;
     ColumnInfoRecord cirPrev = null;
     while (rs.PeekNextClass() == typeof(ColumnInfoRecord))
     {
         ColumnInfoRecord cir = (ColumnInfoRecord)rs.GetNext();
         records.Add(cir);
         if (cirPrev != null && CIRComparator.CompareColInfos(cirPrev, cir) > 0)
         {
             isInOrder = false;
         }
         cirPrev = cir;
     }
     if (records.Count < 1)
     {
         throw new InvalidOperationException("No column info records found");
     }
     if (!isInOrder)
     {
         records.Sort(CIRComparator.instance);
     }
 }
示例#13
0
 public void Construct(CellValueRecordInterface rec, RecordStream rs, SharedValueManager sfh)
 {
     if (rec is FormulaRecord)
     {
         FormulaRecord formulaRec = (FormulaRecord)rec;
         // read optional cached text value
         StringRecord cachedText=null;
         Type nextClass = rs.PeekNextClass();
         if (nextClass == typeof(StringRecord))
         {
             cachedText = (StringRecord)rs.GetNext();
         }
         else
         {
             cachedText = null;
         }
         InsertCell(new FormulaRecordAggregate(formulaRec, cachedText, sfh));
     }
     else
     {
         InsertCell(rec);
     }
 }
示例#14
0
        private WorkbookRecordList _workbookRecordList; // TODO - would be nice to Remove this

        public LinkTable(List<Record> inputList, int startIndex, WorkbookRecordList workbookRecordList, Dictionary<String, NameCommentRecord> commentRecords)
        {

            _workbookRecordList = workbookRecordList;
            RecordStream rs = new RecordStream(inputList, startIndex);

            ArrayList temp = new ArrayList();
            while (rs.PeekNextClass() == typeof(SupBookRecord))
            {
                temp.Add(new ExternalBookBlock(rs));
            }

            //_externalBookBlocks = new ExternalBookBlock[temp.Count];
            _externalBookBlocks = (ExternalBookBlock[])temp.ToArray(typeof(ExternalBookBlock));
            temp.Clear();

            if (_externalBookBlocks.Length > 0)
            {
                // If any ExternalBookBlock present, there is always 1 of ExternSheetRecord
                if (rs.PeekNextClass() != typeof(ExternSheetRecord))
                {
                    // not quite - if written by google docs
                    _externSheetRecord = null;
                }
                else
                {
                    _externSheetRecord = ReadExtSheetRecord(rs);
                }
            }
            else
            {
                _externSheetRecord = null;
            }

            _definedNames = new List<NameRecord>();
            // collect zero or more DEFINEDNAMEs id=0x18
            while (true)
            {

                Type nextClass = rs.PeekNextClass();
                if (nextClass == typeof(NameRecord))
                {
                    NameRecord nr = (NameRecord)rs.GetNext();
                    _definedNames.Add(nr);
                }
                else if (nextClass == typeof(NameCommentRecord))
                {
                    NameCommentRecord ncr = (NameCommentRecord)rs.GetNext();
                    //commentRecords.Add(ncr.NameText, ncr);
                    commentRecords[ncr.NameText] = ncr;
                }
                else
                {
                    break;
                }
            }

            _recordCount = rs.GetCountRead();
            for (int i = startIndex; i < startIndex + _recordCount; i++)
            {
                _workbookRecordList.Records.Add(inputList[i]);
            }

        }
示例#15
0
            public ExternalBookBlock(RecordStream rs)
            {
                _externalBookRecord = (SupBookRecord)rs.GetNext();
                ArrayList temp = new ArrayList();
                while (rs.PeekNextClass() == typeof(ExternalNameRecord))
                {
                    temp.Add(rs.GetNext());
                }
                _externalNameRecords = (ExternalNameRecord[])temp.ToArray(typeof(ExternalNameRecord));

                temp.Clear();

                while (rs.PeekNextClass() == typeof(CRNCountRecord))
                {
                    temp.Add(new CRNBlock(rs));
                }
                _crnBlocks = (CRNBlock[])temp.ToArray(typeof(CRNBlock));
            }
示例#16
0
        private WorkbookRecordList _workbookRecordList; // TODO - would be nice to Remove this

        public LinkTable(IList inputList, int startIndex, WorkbookRecordList workbookRecordList)
        {

            _workbookRecordList = workbookRecordList;
            RecordStream rs = new RecordStream(inputList, startIndex);

            ArrayList temp = new ArrayList();
            while (rs.PeekNextClass() == typeof(SupBookRecord))
            {
                temp.Add(new ExternalBookBlock(rs));
            }

            //_externalBookBlocks = new ExternalBookBlock[temp.Count];
            _externalBookBlocks=(ExternalBookBlock[])temp.ToArray(typeof(ExternalBookBlock));
            temp.Clear();

            if (_externalBookBlocks.Length > 0)
            {
                // If any ExternalBookBlock present, there Is always 1 of ExternSheetRecord
                Record next = rs.GetNext();
                _externSheetRecord = (ExternSheetRecord)next;
            }
            else
            {
                _externSheetRecord = null;
            }

            _definedNames = new ArrayList();
            // collect zero or more DEFINEDNAMEs id=0x18
            while (rs.PeekNextClass() == typeof(NameRecord))
            {
                NameRecord nr = (NameRecord)rs.GetNext();
                _definedNames.Add(nr);
            }

            _recordCount = rs.GetCountRead();
            for(int i=startIndex;i< startIndex + _recordCount;i++)
            {
                _workbookRecordList.Records.Add(inputList[i]);
            }
            
        }