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个字节为每个区块的大小,地址和大小数据会随着内容量的变化而发生变化。
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明
本页地址: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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28