版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明
本页地址:http://www.alongly.com/content/xlsresearch.html
第一章、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个字节为每个区块的大小,地址和大小数据会随着内容量的变化而发生变化。


杭州格原