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