private bool readWorkSheetGlobals(XlsWorksheet sheet, out XlsBiffIndex idx)
		{
			idx = null;
			
			m_stream.Seek((int)sheet.DataOffset, SeekOrigin.Begin);

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

			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;
			}

			idx.IsV8 = isV8();

			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);

			m_maxCol = 256;

			if (dims != null)
			{
				dims.IsV8 = isV8();
				m_maxCol = dims.LastColumn - 1;
				sheet.Dimensions = dims;
			}

			m_maxRow = (int)idx.LastExistingRow;

			if (idx.LastExistingRow <= idx.FirstExistingRow)
			{
				return false;
			}

			m_depht = 0;

			return true;
		}
		//TODO: quite a bit of duplication with the noindex version
		private void 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 < 0)
					return;

				//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)
								Helpers.AddColumnHandleDuplicate(table, m_cellsValues[i].ToString());
							else
								Helpers.AddColumnHandleDuplicate(table, 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);
				}
					
			}
		}
        private bool readWorkSheetGlobals(XlsWorksheet sheet, out XlsBiffIndex idx)
        {
            m_stream.Seek((int)sheet.DataOffset, SeekOrigin.Begin);

            XlsBiffBOF bof = m_stream.Read() as XlsBiffBOF;

            idx = null;

            if (bof == null || bof.Type != BIFFTYPE.Worksheet) return false;

            idx = m_stream.Read() as XlsBiffIndex;

            if (null == idx) return false;

            idx.IsV8 = isV8();

            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);

            m_maxCol = 256;

            if (dims != null)
            {
                dims.IsV8 = isV8();
                m_maxCol = dims.LastColumn - 1;
                sheet.Dimensions = dims;
            }

            m_maxRow = (int)idx.LastExistingRow;

            if (idx.LastExistingRow <= idx.FirstExistingRow)
            {
                return false;
            }

            m_depht = 0;

            return true;
        }
		private bool readWorkSheetGlobals(XlsWorksheet sheet, out XlsBiffIndex idx, out XlsBiffRow row)
		{
			idx = null;
			row = null;

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

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

			//DumpBiffRecords();

			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();
				LogManager.Log(this).Debug("INDEX IsV8={0}", idx.IsV8);
			}
				


			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);

			//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();

				LogManager.Log(this).Debug("finding rowRecord offset {0}, rec: {1}", thisRec.Offset, thisRec.ID);
				if (thisRec is XlsBiffEOF)
					break;
				rowRecord = thisRec as XlsBiffRow;
			}

			if (rowRecord != null)
				LogManager.Log(this).Debug("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;

			return true;
		}
Esempio n. 5
0
		private bool readWorkSheetGlobals(XlsWorksheet sheet, out XlsBiffIndex idx, out XlsBiffRow row)
		{
			idx = null;
			row = null;

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

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

			//DumpBiffRecords();

			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();

			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);

			//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;
				XlsBiffRecord thisRec = m_stream.Read();
				if (thisRec is XlsBiffEOF)
					break;
				rowRecord = thisRec as XlsBiffRow;
			}

			row = rowRecord;

			m_maxCol = 256;

			if (dims != null)
			{
				dims.IsV8 = isV8();
				m_maxCol = dims.LastColumn - 1;
				sheet.Dimensions = dims;
			}

			m_maxRow = idx == null ? (int)dims.LastRow : (int)idx.LastExistingRow;

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

			m_depth = 0;

			return true;
		}