MS Excel文件格式研究 MS Excel文件格式研究

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

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

第一章、XLS文件和十六进制

1.1XLS文件和BIFF版本对照

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

-------------------------------------------

EXCEL版本                       BIFF版本

-------------------------------------------

EXCEL8.0(EXCEL97)        BIFF8

EXCEL9.0(EXCEL2000)    BIFF8

EXCEL10.0(EXCELXP)      BIFF8x

EXCEL11.0(EXCEL 2003)  BIFF8x

-------------------------------------------

其中BIFF8xBIFF8的扩展版本,它在BIFF8的基础上改动了部分属性值。

1.2 结构知识

在介绍XLS的文件结构时,大家需要知道关于XLS二进制文件的一些基本的结构内容知识:

1) 在文件数据的二进制存储中,低位8字节存放在地址的低位,高位8字节存放在地址的高位,因此在用十六进制编辑器来查看XLS文件时,对于一个完整的双字节,它的显示如 09 08,那么他的十六进制值应该为0x0809 

2) XLS文件中的每条完整的数据是由一个标识、长度和数据内容来体现的,如某条数据显示 09 08 02 00 0000,那么09 08代表这条完整数据的标识,02 00代表后面内容的长度,而00 00为实际的内容数据。

3) 在数据结构中,1block的大小为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                                     最小占8block4096 bytes

Summary Information                   8block4096 bytes),固定大小。

Document Summary Information  8block4096 bytes),固定大小。

BigBlock pointer                            1block512 bytes),固定大小。

RootEntry                                     1block512 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           WorkBookGlobals0x0005

--------------------------------------------------------------------------------------------------------

0x0031 FONT,长度24bytes

0x041E FORMAT

0x00E0 XF Extend FORMAT

0x0293 STYLE

0x0085 BOUNDSHEET,即Sheet指针区,NSheet则有N0x0085,包含每个Sheet的名称、sheet数据内容在xls文件中的偏移量。

Offset        Size                  Content

--------------------------------------------------------------------------------------

0                   4          SheetBOF的绝对位移量,相对于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 Header20 bytes

0x020B Index16+4*N个字节

 

Offset        Size                  Content

--------------------------------------------------------------------------------------

0                  4         保留

4                  4         第一行的序号

8                  4         最后一行的序号(OpenOffice上介绍是sheet结尾的第一个未使用行的序号,行数的基数按0开始)

10                4         指向DEFCOLWIDTH0x0055)相对于Workbook Header的位置

14                4*N     指向DBCELL0x00D7)相对于Workbook Header的位置,当存在多个DBCELL时,需要设置多个。N为该sheet的行数/32

--------------------------------------------------------------------------------------

0x0055 DEFCOLWIDTH6 bytes

0x0200 Dimensions18 byte,存放sheet1的行数和列数。

 

Offset        Size                  Content

--------------------------------------------------------------------------------------

0                  4          第一行的序号

4                  4          最后一行的序号

8                  2          第一列的序号

10                2          最后一列的序号

12                2          保留

--------------------------------------------------------------------------------------

Row Block

0x0208 Row20 bytesSheet中有多少行就有对应多少个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 LABELSST14bytes,针对字符串值已经在SST中保存,这里只保存其对应的序号。

0x027E RK214bytes,针对RK值(指编过码的整型或浮点型值)

0x00BD MULRK28 bytes

0x00D7 DBCELL,随着行数的变化而发生变化。

 

Offset        Size                  Content

--------------------------------------------------------------------------------------

0                  4         DBCELL的偏移量减去Row Block中第一个Row的偏移量

4                  2         CellBlock中首行的第一个Cell的偏移量减去Row Block中第二个Row的偏移量

 

以下为循环处理部分,1<n<=Max_Row

6                  2         CellBlock中第n行的第一个Cell的偏移量减去第n-1行的第一个Cell的偏移量

--------------------------------------------------------------------------------------

XLS中的行数大于32时,系统将循环处理,对于每个32行内容单独生成Row BlockCell BlockDBCELL

0x0809 Sheet2内容

0x0809 Sheet3内容(如果有Sheet2Sheet3

0x 000A EOFWorkbook结束标示符

2.4 Summary Information

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

2.5 Document Summary Information

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

2.6 BigBlock Pointer

每四个字节存放一个bigBlockChain


参考资料:OpenOffice Excel File Format


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值