/// <summary> /// Private method, reads Workbook Globals section /// </summary> private void ReadWorkbookGlobals() { m_globals = new XlsWorkbookGlobals(); m_stream.Seek(0, SeekOrigin.Begin); XlsBiffRecord rec = m_stream.Read(); XlsBiffBOF bof = rec as XlsBiffBOF; if (bof == null || bof.Type != BIFFTYPE.WorkbookGlobals) { throw new InvalidDataException("Oops! Stream has invalid data"); } m_version = bof.Version; m_encoding = Encoding.Unicode; bool isV8 = (m_version >= 0x600); bool sst = false; while ((rec = m_stream.Read()) != null) { try { switch (rec.ID) { case BIFFRECORDTYPE.INTERFACEHDR: m_globals.InterfaceHdr = (XlsBiffInterfaceHdr)rec; break; case BIFFRECORDTYPE.BOUNDSHEET: XlsBiffBoundSheet sheet = (XlsBiffBoundSheet)rec; if (sheet.Type != XlsBiffBoundSheet.SheetType.Worksheet) { break; } sheet.IsV8 = isV8; sheet.UseEncoding = m_encoding; m_sheets.Add(new XlsWorksheet(m_globals.Sheets.Count, sheet)); m_globals.Sheets.Add(sheet); break; case BIFFRECORDTYPE.MMS: m_globals.MMS = rec; break; case BIFFRECORDTYPE.COUNTRY: m_globals.Country = rec; break; case BIFFRECORDTYPE.CODEPAGE: m_globals.CodePage = (XlsBiffSimpleValueRecord)rec; m_encoding = Encoding.GetEncoding(m_globals.CodePage.Value); break; case BIFFRECORDTYPE.FONT: case BIFFRECORDTYPE.FONT_V34: m_globals.Fonts.Add(rec); break; case BIFFRECORDTYPE.FORMAT: case BIFFRECORDTYPE.FORMAT_V23: m_globals.Formats.Add(rec); break; case BIFFRECORDTYPE.XF: case BIFFRECORDTYPE.XF_V4: case BIFFRECORDTYPE.XF_V3: case BIFFRECORDTYPE.XF_V2: m_globals.ExtendedFormats.Add(rec); break; case BIFFRECORDTYPE.SST: m_globals.SST = (XlsBiffSST)rec; sst = true; break; case BIFFRECORDTYPE.CONTINUE: if (!sst) { break; } XlsBiffContinue contSST = (XlsBiffContinue)rec; m_globals.SST.Append(contSST); break; case BIFFRECORDTYPE.EXTSST: m_globals.ExtSST = rec; sst = false; break; case BIFFRECORDTYPE.EOF: if (m_globals.SST != null) { m_globals.SST.ReadStrings(); } return; default: continue; } } catch (Exception ex) { _log.Error(ex.ToString()); } } }
/// <summary> /// Appends Continue record to SST /// </summary> /// <param name="fragment">Continue record</param> public void Append(XlsBiffContinue fragment) { continues.Add((uint)fragment.Offset); m_size += (uint)fragment.Size; }
private void ReadWorkbookGlobals() { m_globals = new XlsWorkbookGlobals(); m_stream.Seek(0, SeekOrigin.Begin); XlsBiffRecord rec = m_stream.Read(); XlsBiffBOF bof = rec as XlsBiffBOF; if (bof == null || bof.Type != BIFFTYPE.WorkbookGlobals) { throw new ArgumentException(Errors.ErrorWorkbookGlobalsInvalidData); } m_version = bof.Version; bool sst = false; while (null != (rec = m_stream.Read())) { switch (rec.ID) { case BIFFRECORDTYPE.INTERFACEHDR: m_globals.InterfaceHdr = (XlsBiffInterfaceHdr)rec; break; case BIFFRECORDTYPE.BOUNDSHEET: XlsBiffBoundSheet sheet = (XlsBiffBoundSheet)rec; if (sheet.Type != XlsBiffBoundSheet.SheetType.Worksheet) { break; } sheet.IsV8 = IsV8(); sheet.UseEncoding = m_encoding; m_sheets.Add(new XlsWorksheet(m_globals.Sheets.Count, sheet)); m_globals.Sheets.Add(sheet); break; case BIFFRECORDTYPE.MMS: m_globals.MMS = rec; break; case BIFFRECORDTYPE.COUNTRY: m_globals.Country = rec; break; case BIFFRECORDTYPE.CODEPAGE: m_globals.CodePage = (XlsBiffSimpleValueRecord)rec; try { m_encoding = Encoding.GetEncoding(m_globals.CodePage.Value); } catch { // Warning - Password protection // TODO: Attach to ILog } break; case BIFFRECORDTYPE.FONT: case BIFFRECORDTYPE.FONT_V34: m_globals.Fonts.Add(rec); break; case BIFFRECORDTYPE.FORMAT: case BIFFRECORDTYPE.FORMAT_V23: m_globals.Formats.Add(rec); break; case BIFFRECORDTYPE.XF: case BIFFRECORDTYPE.XF_V4: case BIFFRECORDTYPE.XF_V3: case BIFFRECORDTYPE.XF_V2: m_globals.ExtendedFormats.Add(rec); break; case BIFFRECORDTYPE.SST: m_globals.SST = (XlsBiffSST)rec; sst = true; break; case BIFFRECORDTYPE.CONTINUE: if (!sst) { break; } XlsBiffContinue contSST = (XlsBiffContinue)rec; m_globals.SST.Append(contSST); break; case BIFFRECORDTYPE.EXTSST: m_globals.ExtSST = rec; sst = false; break; case BIFFRECORDTYPE.PROTECT: case BIFFRECORDTYPE.PASSWORD: case BIFFRECORDTYPE.PROT4REVPASSWORD: m_IsProtected = true; break; case BIFFRECORDTYPE.EOF: if (m_globals.SST != null) { m_globals.SST.ReadStrings(); } return; default: continue; } } }
private void readWorkBookGlobals() { //Read Header try { m_hdr = XlsHeader.ReadHeader(m_file); } catch (Exceptions.HeaderException ex) { fail(ex.Message); return; } catch (FormatException ex) { fail(ex.Message); return; } XlsRootDirectory dir = new XlsRootDirectory(m_hdr); XlsDirectoryEntry workbookEntry = dir.FindEntry(WORKBOOK) ?? dir.FindEntry(BOOK); if (workbookEntry == null) { fail(Errors.ErrorStreamWorkbookNotFound); return; } if (workbookEntry.EntryType != STGTY.STGTY_STREAM) { fail(Errors.ErrorWorkbookIsNotStream); return; } m_stream = new XlsBiffStream(m_hdr, workbookEntry.StreamFirstSector, workbookEntry.IsEntryMiniStream, dir, this); m_globals = new XlsWorkbookGlobals(); m_stream.Seek(0, SeekOrigin.Begin); XlsBiffRecord rec = m_stream.Read(); XlsBiffBOF bof = rec as XlsBiffBOF; if (bof == null || bof.Type != BIFFTYPE.WorkbookGlobals) { fail(Errors.ErrorWorkbookGlobalsInvalidData); return; } bool sst = false; m_version = bof.Version; m_sheets = new List <XlsWorksheet>(); while (null != (rec = m_stream.Read())) { switch (rec.ID) { case BIFFRECORDTYPE.INTERFACEHDR: m_globals.InterfaceHdr = (XlsBiffInterfaceHdr)rec; break; case BIFFRECORDTYPE.BOUNDSHEET: XlsBiffBoundSheet sheet = (XlsBiffBoundSheet)rec; if (sheet.Type != XlsBiffBoundSheet.SheetType.Worksheet) { break; } sheet.IsV8 = isV8(); sheet.UseEncoding = m_encoding; LogManager.Log(this).Debug("BOUNDSHEET IsV8={0}", sheet.IsV8); m_sheets.Add(new XlsWorksheet(m_globals.Sheets.Count, sheet)); m_globals.Sheets.Add(sheet); break; case BIFFRECORDTYPE.MMS: m_globals.MMS = rec; break; case BIFFRECORDTYPE.COUNTRY: m_globals.Country = rec; break; case BIFFRECORDTYPE.CODEPAGE: m_globals.CodePage = (XlsBiffSimpleValueRecord)rec; try { m_encoding = Encoding.GetEncoding(m_globals.CodePage.Value); } catch (ArgumentException) { // Warning - Password protection // TODO: Attach to ILog } break; case BIFFRECORDTYPE.FONT: case BIFFRECORDTYPE.FONT_V34: m_globals.Fonts.Add(rec); break; case BIFFRECORDTYPE.FORMAT_V23: { var fmt = (XlsBiffFormatString)rec; fmt.UseEncoding = m_encoding; m_globals.Formats.Add((ushort)m_globals.Formats.Count, fmt); } break; case BIFFRECORDTYPE.FORMAT: { var fmt = (XlsBiffFormatString)rec; m_globals.Formats.Add(fmt.Index, fmt); } break; case BIFFRECORDTYPE.XF: case BIFFRECORDTYPE.XF_V4: case BIFFRECORDTYPE.XF_V3: case BIFFRECORDTYPE.XF_V2: m_globals.ExtendedFormats.Add(rec); break; case BIFFRECORDTYPE.SST: m_globals.SST = (XlsBiffSST)rec; sst = true; break; case BIFFRECORDTYPE.CONTINUE: if (!sst) { break; } XlsBiffContinue contSST = (XlsBiffContinue)rec; m_globals.SST.Append(contSST); break; case BIFFRECORDTYPE.EXTSST: m_globals.ExtSST = rec; sst = false; break; case BIFFRECORDTYPE.PROTECT: case BIFFRECORDTYPE.PASSWORD: case BIFFRECORDTYPE.PROT4REVPASSWORD: //IsProtected break; case BIFFRECORDTYPE.EOF: if (m_globals.SST != null) { m_globals.SST.ReadStrings(); } return; default: continue; } } }
private void readWorkBookGlobals() { XlsBiffRecord record; bool flag; try { this.m_hdr = XlsHeader.ReadHeader(this.m_file); } catch (HeaderException exception) { this.fail(exception.Message); return; } catch (FormatException exception2) { this.fail(exception2.Message); return; } XlsRootDirectory rootDir = new XlsRootDirectory(this.m_hdr); XlsDirectoryEntry entry = rootDir.FindEntry("Workbook") ?? rootDir.FindEntry("Book"); if (entry != null) { if (entry.EntryType != STGTY.STGTY_STREAM) { this.fail("Error: Workbook directory entry is not a Stream."); return; } this.m_stream = new XlsBiffStream(this.m_hdr, entry.StreamFirstSector, entry.IsEntryMiniStream, rootDir); this.m_globals = new XlsWorkbookGlobals(); this.m_stream.Seek(0, SeekOrigin.Begin); XlsBiffBOF fbof = this.m_stream.Read() as XlsBiffBOF; if ((fbof == null) || (fbof.Type != BIFFTYPE.WorkbookGlobals)) { this.fail("Error reading Workbook Globals - Stream has invalid data."); return; } flag = false; this.m_version = fbof.Version; this.m_sheets = new List <XlsWorksheet>(); } else { this.fail("Error: Neither stream 'Workbook' nor 'Book' was found in file."); return; } while ((record = this.m_stream.Read()) != null) { BIFFRECORDTYPE iD = record.ID; if (iD <= BIFFRECORDTYPE.COUNTRY) { switch (iD) { case BIFFRECORDTYPE.FORMAT_V23: { XlsBiffFormatString str = (XlsBiffFormatString)record; str.UseEncoding = this.m_encoding; this.m_globals.Formats.Add((ushort)this.m_globals.Formats.Count, str); break; } case BIFFRECORDTYPE.FONT: goto Label_031C; case BIFFRECORDTYPE.EOF: goto Label_03F3; case BIFFRECORDTYPE.CODEPAGE: goto Label_02E4; case BIFFRECORDTYPE.XF_V2: goto Label_0395; case BIFFRECORDTYPE.CONTINUE: goto Label_03C0; case BIFFRECORDTYPE.BOUNDSHEET: { XlsBiffBoundSheet refSheet = (XlsBiffBoundSheet)record; if (refSheet.Type == XlsBiffBoundSheet.SheetType.Worksheet) { refSheet.IsV8 = this.isV8(); refSheet.UseEncoding = this.m_encoding; this.m_sheets.Add(new XlsWorksheet(this.m_globals.Sheets.Count, refSheet)); this.m_globals.Sheets.Add(refSheet); } break; } case BIFFRECORDTYPE.COUNTRY: this.m_globals.Country = record; break; } } else if (iD <= BIFFRECORDTYPE.EXTSST) { switch (iD) { case BIFFRECORDTYPE.SST: this.m_globals.SST = (XlsBiffSST)record; flag = true; break; case BIFFRECORDTYPE.EXTSST: this.m_globals.ExtSST = record; flag = false; break; case BIFFRECORDTYPE.XF: goto Label_0395; case BIFFRECORDTYPE.INTERFACEHDR: this.m_globals.InterfaceHdr = (XlsBiffInterfaceHdr)record; break; case BIFFRECORDTYPE.MMS: goto Label_02C0; } } else if (iD <= BIFFRECORDTYPE.FONT_V34) { if ((iD != BIFFRECORDTYPE.PROT4REVPASSWORD) && (iD == BIFFRECORDTYPE.FONT_V34)) { goto Label_031C; } } else { switch (iD) { case BIFFRECORDTYPE.XF_V3: case BIFFRECORDTYPE.XF_V4: goto Label_0395; case BIFFRECORDTYPE.FORMAT: { XlsBiffFormatString str2 = (XlsBiffFormatString)record; this.m_globals.Formats.Add(str2.Index, str2); break; } } } continue; Label_02C0: this.m_globals.MMS = record; continue; Label_02E4: this.m_globals.CodePage = (XlsBiffSimpleValueRecord)record; try { this.m_encoding = Encoding.GetEncoding(this.m_globals.CodePage.Value); } catch (ArgumentException) { } continue; Label_031C: this.m_globals.Fonts.Add(record); continue; Label_0395: this.m_globals.ExtendedFormats.Add(record); continue; Label_03C0: if (flag) { XlsBiffContinue fragment = (XlsBiffContinue)record; this.m_globals.SST.Append(fragment); } continue; Label_03F3: if (this.m_globals.SST != null) { this.m_globals.SST.ReadStrings(); } return; } }