XLS碎片另类解释
第一章、XLS文件和十六进制
1.1 XLS文件和BIFF版本对照
通常我们把EXCEL的文件格式叫做BIFF,即 Binary Interchange File Format的缩写,随着EXCEL的不断升级,其文件格式BIFF也在同步的更新与完善,因此对于不同版本的EXCEL有着不同的BIFF版本,下表对EXCEL目前最常用的版本和BIFF的部分版本进行了对照。
EXCEL版本
BIFF版本
EXCEL 8.0(EXCEL 97)
BIFF8
EXCEL 9.0(EXCEL 2000)
BIFF8
EXCEL 10.0(EXCEL XP)
BIFF8x
EXCEL 11.0(EXCEL 2003)
BIFF8x
其中BIFF8x为BIFF8的扩展版本,它在BIFF8的基础上改动了部分属性值。
1.2 结构知识
在介绍XLS的文件结构时,大家需要知道关于XLS二进制文件的一些基本的结构内容知识:
1、 在文件数据的二进制存储中,低位8字节存放在地址的低位,高位8字节存放在地址的高位,因此在用十六进制编辑器来查看XLS文件时,对于一个完整的双字节,它的显示如 09 08,那么他的十六进制值应该为0x0809。
2、 XLS文件中的每条完整的数据是由一个标识、长度和数据内容来体现的,如某条数据显示 09 08 02 00 00 00,那么09 08代表这条完整数据的标识,02 00代表后面内容的长度,而00 00为实际的内容数据。
3、 在数据结构中,1个block的大小为512bytes,而XLS文件是由整数个block来组成的,因此其大小也均为512的倍数。
4、 XLS文件整体被分为多个子流(SubStream),这些SubStream都由若干个整数倍Block来组成的。
1.3 撰写规范
1、对于数据内容描述的表格,均采用如下样式
Offset
Size
Content
其中
Offset(偏移量):该偏移量是指当前数据内容开始与该段数据内容区开始的偏移值。
Size(大小):该段数据内容区的大小
Content(内容):该段数据内容区的部分值或是说明
2、对于一段完整的数据区的描述方式为:
标识头+ 标识名称 + 标识说明+ 数据内容
第二章、XLS文件格式
2.1 XLS文件框架
XLS文件作为一个文件流(FileStream),是由多个子流(SubStream)构成的,以下的表格将XLS文件的各个SubStream按照顺序依次展现出来,其中包括了对XLS的各个SubStream的大小的说明,这样可以方便于大家对XLS文件格式有个总体的认识,同时我们由下面的各个Substream的大小可以看出,XLS文件的大小最少也为13,824 bytes。
SubStream
描述
XLS Header区
占1 block (512 bytes),固定大小。
WorkBook区
最小占8个block(4096 bytes)
Summary Information区
占8个block(4096 bytes),固定大小。
Document Summary Information区
占8个block(4096 bytes),固定大小。
BigBlock pointer区
占1个block(512 bytes),固定大小。
RootEntry区
占1个block(512 byte s),固定大小。
其中WorkBook为数据变化区,它会随着文件内容的增大而增大,但始终保持Block的整数倍。
2.2 XLS Header
XLS文件的重要部位,如下表所示,其中所列位置和值对于生成XLS文件尤为重要。
Offset
Size
Content
48
4
ROOT_START_BLOCK_POS,指向ROOT所在Block个数
76
4
BIG_BLOCK_DEPOT_BLOCKS_POS,指向BigBlock所在的Block个数
2.3 WorkBook
以下为WorkBook区的重要内容结构:
0x0809 Workbook Header,即BOF,长度范围1~20
Offset
Size
Content
0
2
存放XLS文件的版本类型
BIFF8/ BIFF8X 0x0600
BIFF7 0x0500
2
2
WorkBook Globals,0x0005
0x0031 FONT,长度24bytes。
0x041E FORMAT
0x00E0 XF Extend FORMAT
0x0293 STYLE
0x0085 BOUNDSHEET,即Sheet指针区,N个Sheet则有N个0x0085,包含每个Sheet的名称、sheet数据内容在xls文件中的偏移量。
Offset
Size
Content
0
4
该Sheet的BOF的绝对位移量,相对于Workbook
0x008C Country ,语言和地区设置。
0x00FC SST内容(Sharing String Table 用来存放字符串,目的是为了让各个sheet都能够共享该SST中字符串内容)
Offset
Size
Content
0
4
数据中所有字符串的数量
4
4
将要放在SST中字符串的数量
以下开始针对每个字符串进行循环处理
8
2
该字符串的长度,若为双字节字符也算做一个
10
1
字符串中若包含双字节字符(如中文),则为0x01,若为纯ASCII字符,则为0x00
11
n
存放字符串信息
0x00FF Extended SST内容
在读取XLS文件时显得不重要,但当创建XLS文件时却非常重要
Offset
Size
Content
0
2
每一区块字符串的个数,其值>=8
以下开始针对每一区块字符串进行循环处理
2
4
每一区块第一个字符的绝对位置
6
2
每一区块第一个字符的相对位置
8
2
保留
0x0809 Sheet1内容
0x0809 Header,20 bytes
0x020B Index,16+4*N个字节
Offset
Size
Content
0
4
保留
4
4
第一行的序号
8
4
最后一行的序号(OpenOffice上介绍是sheet结尾的第一个未使用行的序号,行数的基数按0开始)
10
4
指向DEFCOLWIDTH(0x0055)相对于Workbook Header的位置
14
4*N
指向DBCELL(0x00D7)相对于Workbook Header的位置,当存在多个DBCELL时,需要设置多个。
N为该sheet的行数/32
0x0055 DEFCOLWIDTH,6 bytes
0x0200 Dimensions,18 byte,存放sheet1的行数和列数。
Offset
Size
Content
0
4
第一行的序号
4
4
最后一行的序号
8
2
第一列的序号
10
2
最后一列的序号
12
2
保留
Row Block
0x0208 Row,20 bytes,Sheet中有多少行就有对应多少个0x0208开头的行信息,如果sheet中有5行,那么Row Block的大小就是20*5 bytes。
Offset
Size
Content
0
2
行的序号
2
2
列的序号
Cell Block 设置sheet中每一个单元格的信息,顺序为针对每一行的每一列依次设置,如00, 01, 02 ……10, 11, 12 ……20, 21, 22……
0x00FD LABELSST,14bytes,针对字符串值已经在SST中保存,这里只保存其对应的序号。
0x027E RK2,14bytes,针对RK值(指编过码的整型或浮点型值)
0x00BD MULRK,28 bytes
0x00D7 DBCELL,随着行数的变化而发生变化。
Offset
Size
Content
0
4
DBCELL的偏移量减去Row Block中第一个Row的偏移量
4
2
Cell Block中首行的第一个Cell的偏移量减去Row Block中第二个Row的偏移量
以下为循环处理部分,1<n<=Max_Row
6
2
Cell Block中第n行的第一个Cell的偏移量减去第n-1行的第一个Cell的偏移量
当XLS中的行数大于32时,系统将循环处理,对于每个32行内容单独生成Row Block、Cell Block和DBCELL。
0x0809 Sheet2内容
0x0809 Sheet3内容 (如果有Sheet2、Sheet3)
0x000A EOF,Workbook结束标示符
2.4 Summary Information
属性,如作者,工作表类型等Excel中点击文件—〉属性的部分内容存放在此。
2.5 Document Summary Information
文档的属性,具体存放的内容大家可以研究研究。
2.6 BigBlock Pointer
每四个字节存放一个bigBlockChain。
2.7 Root Entry
文件结尾部分,其中对几个substream进行了描述,每个substream的描述占128个字节。
Offset
Size
Content
0
128
存放文件中Root Entry属性 地址和大小
128
128
Workbook属性,地址和大小,占有实际数据的内容
256
128
SummaryInformation属性,地址和大小
384
128
DocumentSummaryInformation的属性,地址和大小
针对每个128字节内容,其偏移量116后的4个字节为每个区块的开始位置,之后的4个字节为每个区块的大小,地址和大小数据会随着内容量的变化而发生变化。
1.1 XLS文件和BIFF版本对照
通常我们把EXCEL的文件格式叫做BIFF,即 Binary Interchange File Format的缩写,随着EXCEL的不断升级,其文件格式BIFF也在同步的更新与完善,因此对于不同版本的EXCEL有着不同的BIFF版本,下表对EXCEL目前最常用的版本和BIFF的部分版本进行了对照。
EXCEL版本
BIFF版本
EXCEL 8.0(EXCEL 97)
BIFF8
EXCEL 9.0(EXCEL 2000)
BIFF8
EXCEL 10.0(EXCEL XP)
BIFF8x
EXCEL 11.0(EXCEL 2003)
BIFF8x
其中BIFF8x为BIFF8的扩展版本,它在BIFF8的基础上改动了部分属性值。
1.2 结构知识
在介绍XLS的文件结构时,大家需要知道关于XLS二进制文件的一些基本的结构内容知识:
1、 在文件数据的二进制存储中,低位8字节存放在地址的低位,高位8字节存放在地址的高位,因此在用十六进制编辑器来查看XLS文件时,对于一个完整的双字节,它的显示如 09 08,那么他的十六进制值应该为0x0809。
2、 XLS文件中的每条完整的数据是由一个标识、长度和数据内容来体现的,如某条数据显示 09 08 02 00 00 00,那么09 08代表这条完整数据的标识,02 00代表后面内容的长度,而00 00为实际的内容数据。
3、 在数据结构中,1个block的大小为512bytes,而XLS文件是由整数个block来组成的,因此其大小也均为512的倍数。
4、 XLS文件整体被分为多个子流(SubStream),这些SubStream都由若干个整数倍Block来组成的。
1.3 撰写规范
1、对于数据内容描述的表格,均采用如下样式
Offset
Size
Content
其中
Offset(偏移量):该偏移量是指当前数据内容开始与该段数据内容区开始的偏移值。
Size(大小):该段数据内容区的大小
Content(内容):该段数据内容区的部分值或是说明
2、对于一段完整的数据区的描述方式为:
标识头+ 标识名称 + 标识说明+ 数据内容
第二章、XLS文件格式
2.1 XLS文件框架
XLS文件作为一个文件流(FileStream),是由多个子流(SubStream)构成的,以下的表格将XLS文件的各个SubStream按照顺序依次展现出来,其中包括了对XLS的各个SubStream的大小的说明,这样可以方便于大家对XLS文件格式有个总体的认识,同时我们由下面的各个Substream的大小可以看出,XLS文件的大小最少也为13,824 bytes。
SubStream
描述
XLS Header区
占1 block (512 bytes),固定大小。
WorkBook区
最小占8个block(4096 bytes)
Summary Information区
占8个block(4096 bytes),固定大小。
Document Summary Information区
占8个block(4096 bytes),固定大小。
BigBlock pointer区
占1个block(512 bytes),固定大小。
RootEntry区
占1个block(512 byte s),固定大小。
其中WorkBook为数据变化区,它会随着文件内容的增大而增大,但始终保持Block的整数倍。
2.2 XLS Header
XLS文件的重要部位,如下表所示,其中所列位置和值对于生成XLS文件尤为重要。
Offset
Size
Content
48
4
ROOT_START_BLOCK_POS,指向ROOT所在Block个数
76
4
BIG_BLOCK_DEPOT_BLOCKS_POS,指向BigBlock所在的Block个数
2.3 WorkBook
以下为WorkBook区的重要内容结构:
0x0809 Workbook Header,即BOF,长度范围1~20
Offset
Size
Content
0
2
存放XLS文件的版本类型
BIFF8/ BIFF8X 0x0600
BIFF7 0x0500
2
2
WorkBook Globals,0x0005
0x0031 FONT,长度24bytes。
0x041E FORMAT
0x00E0 XF Extend FORMAT
0x0293 STYLE
0x0085 BOUNDSHEET,即Sheet指针区,N个Sheet则有N个0x0085,包含每个Sheet的名称、sheet数据内容在xls文件中的偏移量。
Offset
Size
Content
0
4
该Sheet的BOF的绝对位移量,相对于Workbook
0x
0x00FC SST内容(Sharing String Table 用来存放字符串,目的是为了让各个sheet都能够共享该SST中字符串内容)
Offset
Size
Content
0
4
数据中所有字符串的数量
4
4
将要放在SST中字符串的数量
以下开始针对每个字符串进行循环处理
8
2
该字符串的长度,若为双字节字符也算做一个
10
1
字符串中若包含双字节字符(如中文),则为0x01,若为纯ASCII字符,则为0x00
11
n
存放字符串信息
0x00FF Extended SST内容
在读取XLS文件时显得不重要,但当创建XLS文件时却非常重要
Offset
Size
Content
0
2
每一区块字符串的个数,其值>=8
以下开始针对每一区块字符串进行循环处理
2
4
每一区块第一个字符的绝对位置
6
2
每一区块第一个字符的相对位置
8
2
保留
0x0809 Sheet1内容
0x0809 Header,20 bytes
0x020B Index,16+4*N个字节
Offset
Size
Content
0
4
保留
4
4
第一行的序号
8
4
最后一行的序号(OpenOffice上介绍是sheet结尾的第一个未使用行的序号,行数的基数按0开始)
10
4
指向DEFCOLWIDTH(0x0055)相对于Workbook Header的位置
14
4*N
指向DBCELL(0x00D7)相对于Workbook Header的位置,当存在多个DBCELL时,需要设置多个。
N为该sheet的行数/32
0x0055 DEFCOLWIDTH,6 bytes
0x0200 Dimensions,18 byte,存放sheet1的行数和列数。
Offset
Size
Content
0
4
第一行的序号
4
4
最后一行的序号
8
2
第一列的序号
10
2
最后一列的序号
12
2
保留
Row Block
0x0208 Row,20 bytes,Sheet中有多少行就有对应多少个0x0208开头的行信息,如果sheet中有5行,那么Row Block的大小就是20*5 bytes。
Offset
Size
Content
0
2
行的序号
2
2
列的序号
Cell Block 设置sheet中每一个单元格的信息,顺序为针对每一行的每一列依次设置,如00, 01, 02 ……10, 11, 12 ……20, 21, 22……
0x00FD LABELSST,14bytes,针对字符串值已经在SST中保存,这里只保存其对应的序号。
0x027E RK2,14bytes,针对RK值(指编过码的整型或浮点型值)
0x00BD MULRK,28 bytes
0x00D7 DBCELL,随着行数的变化而发生变化。
Offset
Size
Content
0
4
DBCELL的偏移量减去Row Block中第一个Row的偏移量
4
2
Cell Block中首行的第一个Cell的偏移量减去Row Block中第二个Row的偏移量
以下为循环处理部分,1<n<=Max_Row
6
2
Cell Block中第n行的第一个Cell的偏移量减去第n-1行的第一个Cell的偏移量
当XLS中的行数大于32时,系统将循环处理,对于每个32行内容单独生成Row Block、Cell Block和DBCELL。
0x0809 Sheet2内容
0x0809 Sheet3内容 (如果有Sheet2、Sheet3)
0x
2.4 Summary Information
属性,如作者,工作表类型等Excel中点击文件—〉属性的部分内容存放在此。
2.5 Document Summary Information
文档的属性,具体存放的内容大家可以研究研究。
2.6 BigBlock Pointer
每四个字节存放一个bigBlockChain。
2.7 Root Entry
文件结尾部分,其中对几个substream进行了描述,每个substream的描述占128个字节。
Offset
Size
Content
0
128
存放文件中Root Entry属性 地址和大小
128
128
Workbook属性,地址和大小,占有实际数据的内容
256
128
SummaryInformation属性,地址和大小
384
128
DocumentSummaryInformation的属性,地址和大小
针对每个128字节内容,其偏移量116后的4个字节为每个区块的开始位置,之后的4个字节为每个区块的大小,地址和大小数据会随着内容量的变化而发生变化。