2012-03-17 106 views
4

我试图读取xls文件的内容而不使用任何xls库,但遇到问题。了解二进制xls文件格式

我正在尝试使用我发现的信息here。它有一个如何阅读文件的一步一步的指令。 也使用此xls-file-specification

我不知道如果我甚至正确做到这一步:

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

根据该文件规范或本页面有list of the record-numbers,我应该寻找的2057(0809h),但整个文件不包含任何地方纪录(尝试时也使用六编辑器找到它)。 但后来我看了说明书中的第20页上的这一部分:

字节交换的Excel BIFF文件是整个 MS-DOS/Windows和Apple Macintosh操作系统运输,等等。为了支持可移植性,Excel会写入BIFF文件,其中文件的低位字节首先出现在文件中,其后跟着高位字节 。

如果我理解正确(不确定我是否)使用的单词的大端,所以我要找的实际上是2312(0908h)。这使我觉得是正确的印象,因为它是在我尝试的每个文件中很早就发现的。

因此然后在下一步:

4,阅读全局子,装载BoundSheet8记录和SST到内存中。有关更多详细信息,请参阅Globals。

我寻找133(8500h),它在BOF后很快就找到了,很好。但问题出在两个步骤:

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

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

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

更新: 好的,我已经进一步了解了这一点。这对我来说很让人困惑,但似乎每条记录也被读作“大端”,即记录中的最后一个变量是文件中最早定位的那个。虽然我不知道它是否适用于长度可变的值?所以,看着this,可变长度的值被列为记录中的最后一个。但显然它们不能作为文件中的第一个来访问,因为如果在该文件之后出现该信息,将无法知道要读入多少个字节? 无论如何,如果我忽略这个值,并跳过2个字节的DT和A /未使用,并读取下面的4个字节作为一个uint它结果为1130在我的情况。再加上第一个BOF的位置,就可以确定BOF的确切位置。这不是巧合,对吧?

现在出现下一个问题。在此之后,BOF记录索引记录应该立即进行。但无论以何种方式在我读取的字节仍是没有意义的...... 这里是什么样子:

09 08 10 00 00 06 10 00 0D BB CC 07 00 00 00 00 06 00 00 00 00 02 0E 00 00 00 00 00 1E 00 00 00 00 00 12 00 00 00 3E 02 12 00 B6 06 00 00 00 00 40 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 7D 00 0C 00 02 00 02 00 DD 06 00 0F 00 00 00 00 7D 00 0C 00 04 00 04等...

前2个字节出现作为BOF记录09 08或0809交换了哪个i (代表BOF),所以其余的应该是INDEX,但没有意义......如果有人能帮助我,我将不胜感激。

+0

“似乎每个记录也被读作”大端“,即记录中的最后一个变量是在文件中最早定位的那个” - 这是不正确的。你应该在_stream_中讨论位置,而不是在文件中。 – 2013-09-18 20:54:37

回答

0

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

+0

感谢您的回答。我确实认为BOF记录可能代表文件以及每张表的开始。感谢您的确认。 – Clox 2012-03-19 09:18:26

0

BOF记录不只是前两个字节。接下来的两个字节“10 00”告诉你记录其余部分的长度(这意味着0x0010或16字节)。但是,在向前计数16个字节之后,那里没有索引记录。 (从the list of record ID's,索引记录的ID应该是523,即0x020b,它将显示为“0b 02”。)

您必须看错了BOF。您必须找不到lbPlyPos指针或错误地跟随它。

所以下面的4个字节是指向我应该去的文件中的位置的指针。但在任何顺序读取这些字节给我一个数字,是不是整个文件

确保您在两个字节,这给你记录的大小跳过大。