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