都在在学习过程中网上收集的资料 , 现在放出希望对大家有用



摘要:由于XLS的文件格式内容过于庞大,本文只对BIFF8和BIFF8x版本的XLS文件的基本框架和重要结构进行介绍,XLS文件属于二进制文件,在本文中统一采用十六进制来表述,通过该文可以让大家方便的用程序来生成自己的BIFF8版本的XLS文件。

关键词:XLS文件格式,XLS二进制文件

第一章、XLS文件和十六进制
1.1 XLS文件和BIFF版本对照
通常我们把EXCEL的文件格式叫做BIFF,即 Binary Interchange File Format的缩写,随着EXCEL的不断升级,其文件格式BIFF也在同步的更新与完善,因此对于不同版本的EXCEL有着不同的BIFF版本,下表对EXCEL目前最常用的版本和BIFF的部分版本进行了对照。

-------------------------------------------
EXCEL版本                       BIFF版本
-------------------------------------------
EXCEL8.0(EXCEL 97)        BIFF8
EXCEL9.0(EXCEL 2000)    BIFF8
EXCEL10.0(EXCEL XP)      BIFF8x
EXCEL11.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 008C 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)
0x 000A EOF,Workbook结束标示符


2.4 Summary Information
属性,如作者,工作表类型等Excel中点击文件—〉属性的部分内容存放在此。

2.5 Document Summary Information
文档的属性,具体存放的内容大家可以研究研究。

2.6 BigBlock Pointer
每四个字节存放一个bigBlockChain。