Represents a worksheet index
Наследование: XlsBiffRecord
Пример #1
0
        //TODO: quite a bit of duplication with the noindex version
        private bool readWholeWorkSheetWithIndex(XlsBiffIndex idx, bool triggerCreateColumns, DataTable table)
        {
            m_dbCellAddrs = idx.DbCellAddresses;

            for (int index = 0; index < m_dbCellAddrs.Length; index++)
            {
                if (m_depth == m_maxRow) break;

                // init reading data
                m_cellOffset = findFirstDataCellOffset((int) m_dbCellAddrs[index]);

                if (m_cellOffset == -2)
                {
                    return false;
                }

                if (m_cellOffset < 0)
                {
                    return true;
                }

                //DataTable columns
                if (triggerCreateColumns)
                {
                    if (_isFirstRowAsColumnNames && readWorkSheetRow() || (_isFirstRowAsColumnNames && m_maxRow == 1))
                    {
                        for (int i = 0; i < m_maxCol; i++)
                        {
                            if (m_cellsValues[i] != null && m_cellsValues[i].ToString().Length > 0)
                            {
                                table.AddColumnHandleDuplicate(m_cellsValues[i].ToString());
                            }
                            else
                            {
                                table.AddColumnHandleDuplicate(string.Concat(COLUMN, i));
                            }
                        }
                    }
                    else
                    {
                        for (int i = 0; i < m_maxCol; i++)
                        {
                            table.Columns.Add(null, typeof (Object));
                        }
                    }

                    triggerCreateColumns = false;

                    table.BeginLoadData();
                }

                while (readWorkSheetRow())
                {
                    table.Rows.Add(m_cellsValues);
                }

                //add the row
                if (m_depth > 0 && !(_isFirstRowAsColumnNames && m_maxRow == 1))
                {
                    table.Rows.Add(m_cellsValues);
                }
            }

            return true;
        }
Пример #2
0
        private bool readWorkSheetGlobals(XlsWorksheet sheet, out XlsBiffIndex idx, out XlsBiffRow row)
        {
            idx = null;
            row = null;

            m_stream.Seek((int)sheet.DataOffset, SeekOrigin.Begin);

            //
            // Read BOF
            //
            XlsBiffBOF bof = m_stream.Read() as XlsBiffBOF;
            if (bof == null || bof.Type != BIFFTYPE.Worksheet)
            {
                return false;
            }

            //DumpBiffRecords();

            //
            // Read Index
            //
            XlsBiffRecord rec = m_stream.Read();
            if (rec == null) return false;
            if (rec is XlsBiffIndex)
            {
                idx = rec as XlsBiffIndex;
            }
            else if (rec is XlsBiffUncalced)
            {
                // Sometimes this come before the index...
                idx = m_stream.Read() as XlsBiffIndex;
            }

            //if (null == idx)
            //{
            //	// There is a record before the index! Chech his type and see the MS Biff Documentation
            //	return false;
            //}

            if (idx != null)
            {
                idx.IsV8 = isV8();
            }

            //
            // Read Demension
            //
            XlsBiffRecord trec;
            XlsBiffDimensions dims = null;

            do
            {
                trec = m_stream.Read();
                if (trec.ID == BIFFRECORDTYPE.DIMENSIONS)
                {
                    dims = (XlsBiffDimensions)trec;
                    break;
                }

            } while (trec != null && trec.ID != BIFFRECORDTYPE.ROW);

            //
            // Read Row
            //
            //if we are already on row record then set that as the row, otherwise step forward till we get to a row record
            if (trec.ID == BIFFRECORDTYPE.ROW)
                row = (XlsBiffRow)trec;

            XlsBiffRow rowRecord = null;
            while (rowRecord == null)
            {
                if (m_stream.Position >= m_stream.Size)
                    break;
                var thisRec = m_stream.Read();

                if (thisRec is XlsBiffEOF)
                    break;
                rowRecord = thisRec as XlsBiffRow;
            }

            if (rowRecord != null)
            {
                ////Console.WriteLine("Got row {0}, rec: id={1},rowindex={2}, rowColumnStart={3}, rowColumnEnd={4}", rowRecord.Offset, rowRecord.ID, rowRecord.RowIndex, rowRecord.FirstDefinedColumn, rowRecord.LastDefinedColumn);
            }

            row = rowRecord;

            if (dims != null)
            {
                dims.IsV8 = isV8();
                ////LogManager.Log(this).Debug("dims IsV8={0}", dims.IsV8);
                m_maxCol = dims.LastColumn - 1;

                //handle case where sheet reports last column is 1 but there are actually more
                if (m_maxCol <= 0 && rowRecord != null)
                {
                    m_maxCol = rowRecord.LastDefinedColumn;
                }

                m_maxRow = (int)dims.LastRow;
                sheet.Dimensions = dims;
            }
            else
            {
                m_maxCol = 256;
                m_maxRow = (int)idx.LastExistingRow;
            }

            if (idx != null && idx.LastExistingRow <= idx.FirstExistingRow)
            {
                return false;
            }
            else if (row == null)
            {
                return false;
            }

            m_depth = 0;

            //
            // Read Hyper Link
            //
            bool hasFound = false;
            while (true)
            {
                if (m_stream.Position >= m_stream.Size)
                    break;
                var thisRecord = m_stream.Read();

                if (thisRecord is XlsBiffEOF)
                {
                    break;
                }

                XlsBiffHyperLink hyperLink = thisRecord as XlsBiffHyperLink;
                if (hyperLink!=null)
                {
                    hasFound = true;
                    ////Console.WriteLine("Read HyperLink");
                    //Console.WriteLine("Url:{0},{1}",hyperLink.Url,hyperLink.CellRangeAddress.ToString());
                    m_globals.AddHyperLink(hyperLink);
                }

                if (hasFound == true && hyperLink == null)
                {
                    break;
                }
            }

            return true;
        }