private DataTable readWholeWorkSheet(XlsWorksheet sheet)
	    {
	        XlsBiffIndex idx;

	        if (!readWorkSheetGlobals(sheet, out idx)) return null;

	        var table = new DataTable(sheet.Name);

	        var triggerCreateColumns = true;

	        m_dbCellAddrs = idx.DbCellAddresses;

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

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

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

	                triggerCreateColumns = false;

	                table.BeginLoadData();
	            }

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

	            if (m_depht > 0 && !(_isFirstRowAsColumnNames && m_maxRow == 1))
	                table.Rows.Add(m_cellsValues);
	        }

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

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

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