了解二进制xls文件格式

Clo*_*lox 5 excel binaryfiles

我正在尝试在不使用任何xls库的情况下读取xls文件的内容,但是这样做有问题。

我正在尝试使用在这里找到的信息。它包含有关如何读取文件的逐步指导。还使用此xls-file-specification

我不确定是否可以正确执行此步骤:

3,打开工作簿流并扫描BOF记录的第一个实例。这是Globals子流的开始。

根据文件规范或带有记录编号列表的页面,我应该寻找2057(0809h),但整个文件都不包含该记录(在尝试查找时也使用十六进制编辑器)它)。但随后,我在规范的第20页上阅读了这一部分:

字节交换Excel BIFF文件可跨MS-DOS / Windows和Apple Macintosh操作系统进行传输。为了支持可移植性,Excel编写了BIFF文件,其中单词的低位字节在文件中首先出现,然后是高位字节。

如果我正确理解(不确定是否会这样做),则会使用单词的大尾数法,因此我实际上要查找的是2312(0908h)。这给人以正确的印象,因为在我尝试的每个文件中都发现它很早。

因此,转到下一步:

4,读取Globals子流,将BoundSheet8记录和SST加载到内存中。有关更多详细信息,请参见全局变量。

我正在寻找133(8500h),在转炉之后不久就发现了,很好。但是问题出在接下来的两个步骤中:

5,从与要打开的子流相对应的BoundSheet8记录中,读取前4个字节,其中包含lbPlyPos FilePointer。6,转到lbPlyPos FilePointer指定的流中的偏移量。这是工作表的BOF记录。

因此,接下来的4个字节是一个指向我应该去的文件位置的指针。但是以任何顺序读取这些字节会得到一个大于整个文件的数字。而且,这部分使我感到困惑:“这是工作表的BOF记录。” 那不是我在先前的步骤中发现的吗?嗯...

对不起,我漫无目的。我希望我有道理,希望有人愿意帮助我一点。

更新: 好的,我对此有了进一步的了解。这让我很困惑,但似乎每条记录也被读为“大端”,即记录中的最后一个变量是最早位于文件中的变量。虽然我不知道它是否适用于可变长度的值?所以,看这个,可变长度的值被列为最后一个记录。但是显然,它们不能作为文件的第一个出现,因为如果该信息后面有信息,将无法知道要读取多少个字节?无论如何,如果我忽略此值,并跳过dt和A / unused的2个字节,并以uint读取以下4个字节,那么我的情况就是1130。将其添加到第一个BOF的位置,即可得到单张BOF的确切位置。

现在出现了下一个问题。在该BOF记录之后,索引记录应该立即跟随。但是,无论我以何种方式读取字节,这仍然毫无意义……这是这样的:

09 08 10 00 00 06 10 00 BB 0D CC 07 00 00 00 00 06 06 00 00 00 00 02 0E 00 00 00 00 00 00 1E 00 00 00 00 00 00 12 00 00 00 3E 02 12 00 B6 06 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 7D 00 0C 00 00 00 00 00 DD 06 0F 00 00 00 00 00 00 7D 00 0C 00 02 00 02 00 DD 06 0F 00 00 00 00 00 7D 00 0C 00 04 00 04等...

BOF记录的前2个字节是09 08,或交换了0809,即2057(代表BOF),因此其余的应该是INDEX,但没有意义...如果有人可以帮助我,我将不胜感激。

len*_*len 0

关于BOF记录,我可以告诉你它指的是文件开始,并且位于excel文件包含的每个子流的开始处。鉴于您通常有 3 个工作表,所有工作表都有 VBA 代码表,并且工作簿有一个代码表,您正在查看 8 个 BOF 记录。