ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 14407|回复: 4

关于Excel二进制文件和Biff格式文件的关系

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-7-18 18:40 | 显示全部楼层 |阅读模式
关于Excel二进制文件和Biff格式文件的关系

BIFF对照.jpg

大家都知道2007能选择.xlsb保存为二进制文件,减少容量的同时提高安全性。有人问excel2003能不能另存为二进制文件?

其实2003中的.xls本身就是二进制文件,.doc和.ppt都是,只不过对应的biff版本低一些。

认为2003默认文件格式不是二进制,是一个误区。

    Microsoft Office 2007中,微软引入了一种全新的文档格式:Open XML。由于Open XML是一种开放的文档格式(基于两种开放技术:XML、Zip),所以解决了过去Microsoft Office所使用的二进制文档难以交互、难以被第三方应用程序访问的问题。但是自从微软决定将Open XML提交给ISO之后,从业界的反馈来看,很多人仍然非常关心过去的二进制文档格式(.doc, .xls, .ppt),并希望能得到其相关的技术细节文档。经过慎重的考虑,Microsoft决定将Microsoft Office所使用的二进制文档格式公开。任何人和企业,在不违反相关协议的前提下,都可以免费得到其技术规范文件。

    BIFF8基于微软的复合文档格式。Excel文档的内容存放在一个Stream里。一个新建的 空白Excel文件,一般包含Root Storge,Workbook Stream,<05H>SummaryInformation Stream,<05H>DocumentSummaryInformation Stream。Workbook Stream就存储了Excel的内容。把整个Excel文件叫Workbook,Workbook里至少有一个Worksheet。Excel文件不仅 存放Excel的文本内容,还存放一些格式,比如字体信息,颜色。

    Workbook globals里就记录了整个Workbook公用的东西,比如格式,字符串常量,文档保护等。worksheets,workbook globals都是存储在Workbook Stream里,可以把它们看做是substream。各个substream按一定顺序出现在Workbook Stream里,Globals Substream是必须的,而且至少保护一个Sheet Substream。那么这些Substream是如何区分开的,如何知道一个Substream从文件的哪个位置开始,哪里结束呢?这得从BIFF8描 述信息所采用的格式来说。这里说的"信息",包含很多,比如格式信息,位置信息,文本信息,图片信息,宏代码信息,等等。这么多信息要记录,BIFF8是 采用Record的方式来记录的。一个Record描述一个信息。因此有很多种Record。因此Record Type肯定是Record数据结构的组成部分。Record是不定长的,种类非常多,各个种类的内容格式千差万别。

    结构包含两部分,Record Header和Record Data。Record Header部分的前2字节是Record Type,然后是2字节描述Record Data的长度。文档 给 出了几乎所有的Record Type,针对每种Record,描述了Record Data里各字节的含义。Substream的开始和结束,就是采用BOF和EOF这两个Record Type。也就是说在Workbook Stream是Record序列,一个Record接着一个Record,有些BOF的record表示接下来要描述一个Substream了。因此处理 程序可以一个Record一个Record的读取,先检查读入的Record的Type,如果不认识,那么就不处理Record data部分,如果认识就解析Record data部分的含义。Excel的版本是不断升级的,补丁是不断更新的,新的版本,新的build就可能有新的Record Type。因此旧版本的Excel打开高版本的xls文件,有些Record就无法识别,但是不影响基本数据的读取。FastExcel就是根据这个原 理,只处理一些和文本内容相关的必需的Record Type,像格式之类的Record就不处理了,因此就Fast了。

    当一个Cell的内容为 字符串常量时,BIFF8一般把这个字符串常量用SST这种Record记录在Global Substream,然后在Sheet Substream里使用LabelSST这种Record引用这个字符串。LabelSST这种Record的Record Data部分就包含了行号,列号,字符串索引号(index)等信息。查看文档,可知LabelSST类型的Record Header的Identifier是00FD(hex),size是10,FastExcel 的项目主页也说了它们只实现了如下的Parser来处理一些Record,仅仅是针对文本内容,BIFF8的Record类型可是几百个。这里的 BOFParser就是处理BOF类型的Record,LabelSSTParser处理LabelSST类型的Record。
* BOFParser
* EOFParser
* BoundSheetParser
* SSTParser
* IndexParser
* DimensionParser
* RowParser
* LabelSSTParser
* RKParser
* MulRKParser
* LabelParser
* BoolerrParser
* XFParser
* FormatParser
* DateModeParser
* StyleParser
* MulBlankParser
* NumberParser
* RStringParser
BIFF8里多字节数据,比如4字节整数,2字节整数,Unicode都是采用Little-Endian的存储方式。

对于xlm不了解的可以参照此文[综合应用] 细品RibbonX(5):开放的XML文件格式 http://www.exceltip.net/thread-5423-1-1-32125.html

[ 本帖最后由 lrlxxqxa 于 2010-7-18 19:17 编辑 ]

Excel对照Biff.rar

2.47 KB, 下载次数: 171

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-18 18:40 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-18 19:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
查看二进制文件常用的工具:
Uedit32c130:用于查看转换的.xls文件的16进制形式。还有转换的.xls文件和Excel生成的.xls文件的比较。

BIFFVIEW.EXE:查看.xls文件的结构和记录组成。

xlspure.exe:另一查看.xls文件的结构和记录组成的工具,当.xls文件过大时,BIFFVIEW.EXE工具查看.xls文件将失效,这时可用xlspure.exe。但它不适合查看SST记录。

TA的精华主题

TA的得分主题

发表于 2010-7-18 21:13 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-4-19 08:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
深层次技术贴.顶一个
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 01:40 , Processed in 0.042177 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表