微软的Excel格式有两种:.xls和.xlsx。Excel2003及之前的版本是.xls格式,从Excel2007开始支持.xlsx格式。只使用基本功能的话两种格式看起来并没有多大差别,但是两者文件格式确实截然不同的。
excel97-2003(xls格式)
XLS文件最为一个文件流(FileStream),是由多个子流(SubStream)构成的,下面这张图是将各个SubStream按顺序依次展现出来,这些SubStream都是有若干个整数倍Block(1 block = 512 bytes)组成。
SubStream |
|
XLS Header |
占1个block(512bytes)固定大小 |
WorkBook |
最小占8个block(4096bytes) |
Summary Information |
占8个block(4096bytes)固定大小 |
Document Summary Information |
占8个block(4096bytes)固定大小 |
XLS Header扩展区 |
只有.xls文件超过一定大小时,才会出现 |
BigBolck pointer |
最小占1个(512bytes) |
RootEntry |
占1个block(512bytes) |
其中所有单元格数据记录在WorkBook子流中,以下为WorkBook区的重要内容结构。
0x0809 WorkbookHeader,即BOF,长度范围1~20
offset |
size |
content |
0 |
2 |
存放XLS文件的版本类型 BIFF8/BIFF8X 0x0600 BIFF7 0x0500 |
2 |
2 |
WorkBookGlobals,0x0005 |
0x0031 FONT,长度24bytes。0x041EFORMAT
0x00E0 XF ExtendFORMAT
0x0293 STYLE
0x0085 BOUNDSHEET,即Sheet指针区,N个Sheet则有N个0x0085,包含每个Sheet的名称、sheet数据内容在xls文件中的偏移量。
offset |
size |
content |
0 |
2 |
数据段长度(Sheet指针区和名称区长度) |
2 |
4 |
该Sheet的BOF的绝对位移量,相对于Workbook |
6 |
Sheet名称区,长度为数据段长度-2 |
0x008C Country,语言和地区设置。
0x00FC