复合文档二进制文件的文件头总是位于文件的起始位置,并且它的大小刚好是512个字节。
复合文档的文件头结构说明如下:
偏移量 字节大小 说明 0 8 复合文件的标识符,值为0xD0CF11E0A1B11AE1 8 16 当前文件的唯一标识符 24 2 复合文件格式的修订版本号 26 2 复合文件格式的版本号 28 2 字节序0xFEFF表示Little-Endian,0xFEFF表示Big-Endian 30 2 Sector大小指数,实际Sector大小=2^SectorShift 32 2 short-sector大小指数,实际short-sector大小=2^SSectorShift 34 10 保留字,10字节,没使用 44 4 SAT拥有的总的Sector数量 48 4 Directory stream的第一个Sector的SecID 52 4 保留字,没使用 56 4 标准stream的最小字节,如果stream小于这个值,则保存为short-streams 60 4 SSAT的第一个Sector的SecID,如果没有,则是-2(End of Chain SecID) 64 4 SSAT拥有的总的Sector数量 68 4 MSAT的第一个Sector的SecID。如果没有,则是-2(End of Chain SecID) 72 4 MSAT拥有的总的Sector数量 76 436 MSAT最先的109个SecID
根据这个文件头的结构说明,可以在vba中自定义如下的文件头结构类型:
Public Type CDFHeader ' 复合文件文件头结构 CFID(7) As Byte ' 复合文件的标识符,值为0xD0CF11E0A1B11AE1 FID(15) As Byte ' 当前文件的唯一标识符 MinorVersion As Integer ' 复合文件格式的修订版本号 MajorVersion As Integer ' 复合文件格式的版本号 ByteOrder As Integer ' 字节序0xFEFF表示Little-Endian,0xFEFF表示0xFFFE表示Big-Endian SectorShift As Integer ' Sector大小指数,实际Sector大小=2^SectorShift SSectorShift As Integer ' short-sector大小指数,实际short-sector大小=2^SSectorShift Reserved(9) As Byte ' 保留字,10字节,没使用 TNSSAT As Long ' SAT拥有的总的Sector数量 DirSecStart As Long ' Directory stream 的第一个Sector的SecID Reserved1 As Long ' 保留字,没使用 MiniStreamSZ As Long ' 标准stream的最小字节,如果stream小于这个值,则保存为short-streams SSATStart As Long ' SSAT的第一个Sector的SecID。如果没有,则是-2(End of Chain SecID) TNSSSAT As Long ' SSAT拥有的总的Sector数量 MASTStart As Long ' MSAT的第一个Sector的SecID。如果没有,则是-2(End of Chain SecID) MASTCount As Long ' MSAT拥有的总的Sector数量 MAST(108) As Long ' MSAT最先的109个SecID End Type
然后用 Open 文件完整路径 For Binary Access Read As 文件号 语句读取文件头的字节内容到自定义类型中,代码如下:
Public Type CDFHeader ' 复合文件文件头结构 CFID(7) As Byte ' 复合文件的标识符,值为0xD0CF11E0A1B11AE1 FID(15) As Byte ' 当前文件的唯一标识符 MinorVersion As Integer ' 复合文件格式的修订版本号 MajorVersion As Integer ' 复合文件格式的版本号 ByteOrder As Integer ' 字节序0xFEFF表示Little-Endian,0xFEFF表示0xFFFE表示Big-Endian SectorShift As Integer ' Sector大小指数,实际Sector大小=2^SectorShift SSectorShift As Integer ' short-sector大小指数,实际short-sector大小=2^SSectorShift Reserved(9) As Byte ' 保留字,10字节,没使用 TNSSAT As Long ' SAT拥有的总的Sector数量 DirSecStart As Long ' Directory stream 的第一个Sector的SecID Reserved1 As Long ' 保留字,没使用 MiniStreamSZ As Long ' 标准stream的最小字节,如果stream小于这个值,则保存为short-streams SSATStart As Long ' SSAT的第一个Sector的SecID。如果没有,则是-2(End of Chain SecID) TNSSSAT As Long ' SSAT拥有的总的Sector数量 MASTStart As Long ' MSAT的第一个Sector的SecID。如果没有,则是-2(End of Chain SecID) MASTCount As Long ' MSAT拥有的总的Sector数量 MAST(108) As Long ' MSAT最先的109个SecID End Type Public CDH As CDFHeader Sub GetCDFH() Dim sPath As String sPath = "c:\1.xls" Dim i As Byte i = VBA.FreeFile Open sPath For Binary Access Read As i Get i, , CDH Close End Sub
发表评论