+ -
当前位置:首页 → 问答吧 → XLS文档研究

XLS文档研究

时间:2006-03-31

来源:互联网

偶要用PHP生成excel的二进制文件,于是写了本文,发现本论坛无法使用HTML,因此格式上不好看,有兴趣的可以去http://www.alongly.com/content/xlsresearch.html看看,还有偶的blog: http://www.alongly.com/,同时还提供在线的用PHP生成XLS文件测试 http://www.alongly.com/content/xlscreater.html

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明
本页地址:http://www.alongly.com/content/xlsresearch.html


摘要:由于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版本

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个字节为每个区块的大小,地址和大小数据会随着内容量的变化而发生变化。

作者: alongly   发布时间: 2006-03-30

rt

作者: alex   发布时间: 2006-03-30

good

作者: bandw   发布时间: 2006-03-31

有心人阿

作者: host   发布时间: 2006-07-10

强啊

作者: dwp34998   发布时间: 2006-07-13

热门下载

更多