/// <summary>
		/// Creates Root Directory catalog from XlsHeader
		/// </summary>
		/// <param name="hdr">XlsHeader object</param>
		public XlsRootDirectory(XlsHeader hdr)
		{
			var stream = new XlsStream(hdr, hdr.RootDirectoryEntryStart);
			var array = stream.ReadStream();
			byte[] tmp;
			XlsDirectoryEntry entry;
			var entries = new List<XlsDirectoryEntry>();
			for (var i = 0; i < array.Length; i += XlsDirectoryEntry.Length)
			{
				tmp = new byte[XlsDirectoryEntry.Length];
				Buffer.BlockCopy(array, i, tmp, 0, tmp.Length);
				entries.Add(new XlsDirectoryEntry(tmp));
			}
			m_entries = entries;
			for (var i = 0; i < entries.Count; i++)
			{
				entry = entries[i];
				if (m_root == null && entry.EntryType == STGTY.STGTY_ROOT)
					m_root = entry;
				if (entry.ChildSid != (uint)FATMARKERS.FAT_FreeSpace)
					entry.Child = entries[(int)entry.ChildSid];
				if (entry.LeftSiblingSid != (uint)FATMARKERS.FAT_FreeSpace)
					entry.LeftSibling = entries[(int)entry.LeftSiblingSid];
				if (entry.RightSiblingSid != (uint)FATMARKERS.FAT_FreeSpace)
					entry.RightSibling = entries[(int)entry.RightSiblingSid];
			}
		}
		public XlsBiffStream(XlsHeader hdr, uint streamStart)
			: base(hdr, streamStart)
		{
			bytes = base.ReadStream();
			m_size = bytes.Length;
			m_offset = 0;
		}
示例#3
0
 public XlsBiffStream(XlsHeader hdr, uint streamStart)
     : base(hdr, streamStart)
 {
     bytes    = base.ReadStream();
     m_size   = bytes.Length;
     m_offset = 0;
 }
示例#4
0
		public XlsStream(XlsHeader hdr, uint startSector)
		{
			m_fileStream = hdr.FileStream;
			m_fat = hdr.FAT;
			m_hdr = hdr;
			m_startSector = startSector;
		}
示例#5
0
 public XlsStream(XlsHeader hdr, uint startSector)
 {
     m_fileStream  = hdr.FileStream;
     m_fat         = hdr.FAT;
     m_hdr         = hdr;
     m_startSector = startSector;
 }
示例#6
0
		/// <summary>
		/// Constructs FAT table from list of sectors
		/// </summary>
		/// <param name="hdr">XlsHeader</param>
		/// <param name="sectors">Sectors list</param>
		public XlsFat(XlsHeader hdr, List<uint> sectors)
		{
			m_hdr = hdr;
			m_sectors_for_fat = sectors.Count;
			uint sector = 0, prevSector = 0;
			var sectorSize = hdr.SectorSize;
			var buff = new byte[sectorSize];
			var file = hdr.FileStream;
			using (var ms = new MemoryStream(sectorSize * m_sectors_for_fat))
			{
				lock (file)
				{
					for (var i = 0; i < sectors.Count; i++)
					{
						sector = sectors[i];
						if (prevSector == 0 || (sector - prevSector) != 1)
							file.Seek((sector + 1) * sectorSize, SeekOrigin.Begin);
						prevSector = sector;
						file.Read(buff, 0, sectorSize);
						ms.Write(buff, 0, sectorSize);
					}
				}
				ms.Seek(0, SeekOrigin.Begin);
				var rd = new BinaryReader(ms);
				m_sectors = (int)ms.Length / 4;
				m_fat = new List<uint>(m_sectors);
				for (var i = 0; i < m_sectors; i++)
					m_fat.Add(rd.ReadUInt32());
				rd.Close();
				ms.Close();
			}
		}
示例#7
0
        /// <summary>
        /// Reads Excel header from Stream
        /// </summary>
        /// <param name="file">Stream with Excel file</param>
        /// <returns>XlsHeader representing specified file</returns>
        public static XlsHeader ReadHeader(Stream file)
        {
            var hdr = new XlsHeader(file);

            lock (file)
            {
                file.Seek(0, SeekOrigin.Begin);
                file.Read(hdr.m_bytes, 0, 512);
            }
            if (!hdr.IsSignatureValid)
            {
                throw new HeaderException(Errors.ErrorHeaderSignature);
            }
            if (hdr.ByteOrder != 0xFFFE)
            {
                throw new FormatException(Errors.ErrorHeaderOrder);
            }
            return(hdr);
        }
示例#8
0
        /// <summary>
        /// Constructs FAT table from list of sectors
        /// </summary>
        /// <param name="hdr">XlsHeader</param>
        /// <param name="sectors">Sectors list</param>
        public XlsFat(XlsHeader hdr, List <uint> sectors)
        {
            m_hdr             = hdr;
            m_sectors_for_fat = sectors.Count;
            uint sector = 0, prevSector = 0;
            var  sectorSize = hdr.SectorSize;
            var  buff       = new byte[sectorSize];
            var  file       = hdr.FileStream;

            using (var ms = new MemoryStream(sectorSize * m_sectors_for_fat))
            {
                lock (file)
                {
                    for (var i = 0; i < sectors.Count; i++)
                    {
                        sector = sectors[i];
                        if (prevSector == 0 || (sector - prevSector) != 1)
                        {
                            file.Seek((sector + 1) * sectorSize, SeekOrigin.Begin);
                        }
                        prevSector = sector;
                        file.Read(buff, 0, sectorSize);
                        ms.Write(buff, 0, sectorSize);
                    }
                }
                ms.Seek(0, SeekOrigin.Begin);
                var rd = new BinaryReader(ms);
                m_sectors = (int)ms.Length / 4;
                m_fat     = new List <uint>(m_sectors);
                for (var i = 0; i < m_sectors; i++)
                {
                    m_fat.Add(rd.ReadUInt32());
                }
                rd.Close();
                ms.Close();
            }
        }
示例#9
0
        /// <summary>
        /// Creates Root Directory catalog from XlsHeader
        /// </summary>
        /// <param name="hdr">XlsHeader object</param>
        public XlsRootDirectory(XlsHeader hdr)
        {
            var stream = new XlsStream(hdr, hdr.RootDirectoryEntryStart);
            var array  = stream.ReadStream();

            byte[]            tmp;
            XlsDirectoryEntry entry;
            var entries = new List <XlsDirectoryEntry>();

            for (var i = 0; i < array.Length; i += XlsDirectoryEntry.Length)
            {
                tmp = new byte[XlsDirectoryEntry.Length];
                Buffer.BlockCopy(array, i, tmp, 0, tmp.Length);
                entries.Add(new XlsDirectoryEntry(tmp));
            }
            m_entries = entries;
            for (var i = 0; i < entries.Count; i++)
            {
                entry = entries[i];
                if (m_root == null && entry.EntryType == STGTY.STGTY_ROOT)
                {
                    m_root = entry;
                }
                if (entry.ChildSid != (uint)FATMARKERS.FAT_FreeSpace)
                {
                    entry.Child = entries[(int)entry.ChildSid];
                }
                if (entry.LeftSiblingSid != (uint)FATMARKERS.FAT_FreeSpace)
                {
                    entry.LeftSibling = entries[(int)entry.LeftSiblingSid];
                }
                if (entry.RightSiblingSid != (uint)FATMARKERS.FAT_FreeSpace)
                {
                    entry.RightSibling = entries[(int)entry.RightSiblingSid];
                }
            }
        }
示例#10
0
		/// <summary>
		/// Reads Excel header from Stream
		/// </summary>
		/// <param name="file">Stream with Excel file</param>
		/// <returns>XlsHeader representing specified file</returns>
		public static XlsHeader ReadHeader(Stream file)
		{
			var hdr = new XlsHeader(file);
			lock (file)
			{
				file.Seek(0, SeekOrigin.Begin);
				file.Read(hdr.m_bytes, 0, 512);
			}
			if (!hdr.IsSignatureValid)
				throw new HeaderException(Errors.ErrorHeaderSignature);
			if (hdr.ByteOrder != 0xFFFE)
				throw new FormatException(Errors.ErrorHeaderOrder);
			return hdr;
		}
	    private void Dispose(bool disposing)
	    {
	        // Check to see if Dispose has already been called.
	        if (!disposed)
	        {
	            if (disposing)
	            {
	                if (m_workbookData != null) m_workbookData.Dispose();

	                if (m_sheets != null) m_sheets.Clear();
	            }

	            m_workbookData = null;
	            m_sheets = null;
	            m_stream = null;
	            m_globals = null;
	            m_encoding = null;
	            m_hdr = null;

	            disposed = true;
	        }
	    }
	    private void fail(string message)
	    {
	        m_exceptionMessage = message;
	        m_isValid = false;

	        m_file.Close();
	        m_isClosed = true;

	        m_workbookData = null;
	        m_sheets = null;
	        m_stream = null;
	        m_globals = null;
	        m_encoding = null;
	        m_hdr = null;
	    }
	    private void readWorkBookGlobals()
	    {
	        //Read Header
	        try
	        {
	            m_hdr = XlsHeader.ReadHeader(m_file);
	        }
	        catch (HeaderException ex)
	        {
	            fail(ex.Message);
	            return;
	        }
	        catch (FormatException ex)
	        {
	            fail(ex.Message);
	            return;
	        }

	        var dir = new XlsRootDirectory(m_hdr);
	        var 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);

	        m_globals = new XlsWorkbookGlobals();

	        m_stream.Seek(0, SeekOrigin.Begin);

	        var rec = m_stream.Read();
	        var bof = rec as XlsBiffBOF;

	        if (bof == null || bof.Type != BIFFTYPE.WorkbookGlobals)
	        { fail(Errors.ErrorWorkbookGlobalsInvalidData); return; }

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