我试图在不使用任何xls-libraries的情况下读取xls文件的内容,但是在执行此操作时遇到了问题。
我正在尝试使用我找到的信息here。它有一个如何读取文件的逐步说明。 同样使用此xls-file-specification。
我不确定我是否正确地执行了此步骤:
3,打开工作簿流并扫描BOF记录的第一个实例。这是Globals子流的开始。
根据文件规范或带有list of the record-numbers的页面,我应该寻找2057(0809h),但整个文件在任何地方都不包含该记录(在尝试时也使用hexa-editor)找到它)。 但后来我在规范第20页上阅读了这一部分:
字节交换Excel BIFF文件可以跨文件传输 MS-DOS / Windows和Apple Macintosh操作系统等。至 支持可传输性,Excel将BIFF文件写入低位 单词的字节首先出现在文件中,然后是高顺序 字节。
如果我理解正确(不确定我这样做)会使用大字的字尾,所以我正在寻找的实际上是2312(0908h)。这使得我觉得很正确,因为它在我尝试的每个文件中很早就找到了。
然后转到下一步:
4,读取Globals子流,将BoundSheet8记录和SST加载到内存中。有关更多详细信息,请参阅Globals。
我寻找133(8500h)并且它在BOF之后不久发现,很好。但问题在于接下来的两个步骤:
5,从与要打开的子流对应的BoundSheet8记录中,读取前4个字节,其中包含lbPlyPos FilePointer。 6,转到lbPlyPos FilePointer指定的流中的偏移量。这是工作表的BOF记录。
因此,以下4个字节是指向我应该去的文件中的位置的指针。但是以任何顺序读取这些字节会给我一个比整个文件大的数字。而且,这部分让我感到困惑:“这是工作表的BOF记录。”这不是我在之前的步骤中发现的吗?嗯...
抱歉我的漫无边际。我希望我有道理,有人会愿意帮我一点。
更新 好的,我已经进一步了解这一点。这对我来说很混乱,但似乎每个记录也被读作“大端”,即记录中的最后一个变量是文件中最早定位的变量。虽然我不知道它是否适用于长度可变的值?因此,查看this,可变长度的值将列为记录中的最后一个值。但显然它们不能成为文件中的第一个,因为如果信息出现之后就没有办法知道要读入多少字节? 无论如何,如果我忽略这个值,并且跳过2个字节用于dt和A / unused并且读取以下4个字节作为uint,在我的情况下它变成1130。将其添加到第一个BOF的位置可以得到板材BOF的确切位置。那不可能是巧合,对吗?
现在出现下一个问题。在那个BOF记录之后,索引记录应该立即跟随。但无论我在字节中以何种方式阅读它仍然没有意义...... 这是它的样子:
09 08 10 00 00 06 10 00 BB 0D 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 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 0F 00 00 00 00 00 7D 00 0C 00 04 00 04等...
前两个字节有BOF记录09 08,或0809交换,这是2057(代表BOF)所以其余应该是INDEX但是没有意义......我会非常感激如果有人可以帮我这个。
答案 0 :(得分:0)
关于BOF记录,我可以告诉你它指的是Begining Of File并且位于excel文件包含的每个子流的开头。鉴于您通常有3个工作表,所有工作表都有VBA代码表,工作簿有一个代码表,您正在查看8个BOF记录。
答案 1 :(得分:0)
BOF记录不仅仅是前两个字节。接下来的两个字节“10 00”告诉您记录其余部分的长度(这意味着0x0010或16字节)。但是,在向前计数16个字节后,那里没有索引记录。 (从the list of record ID's开始,索引记录的ID应为523,即0x020b,显示为“0b 02”。)
你必须看错错误的BOF。你必须要么找不到lbPlyPos指针,要么错误地跟着它。
因此,以下4个字节是指向我应该去的文件中的位置的指针。但是以任何顺序读取这些字节会给我一个比整个文件大的数字
确保跳过提供记录大小的两个字节。