我试图在不使用任何 xls 库的情况下读取 xls 文件的内容,但这样做时遇到问题。
我正在尝试使用我找到的信息here http://msdn.microsoft.com/en-us/library/gg615597.aspx。它有一些关于如何读取文件的分步说明。
也用这个xls 文件规范 http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7AD886/Excel97-2007BinaryFileFormat%28xls%29Specification.pdf.
我不确定我是否正确执行了这一步:
3、打开工作簿流并扫描 BOF 记录的第一个实例。这是 Globals 子流的开始。
根据文件规范或此页面记录编号列表 http://msdn.microsoft.com/en-us/library/dd908813%28v=office.12%29.aspx,我应该寻找 2057(0809h),但整个文件在任何地方都不包含该记录(在尝试查找它时也使用十六进制编辑器)。
但后来我读到了规范第 20 页的这一部分:
字节交换 Excel BIFF 文件可跨网络传输
MS-DOS/Windows 和 Apple Macintosh 操作系统等。到
支持可传输性,Excel 写入 BIFF 文件,其中低位
该字的字节首先出现在文件中,然后是高位
字节。
如果我理解正确(不确定我是否理解),则使用单词的大端序,那么我要查找的实际上是 2312(0908h)。这给人的印象是正确的,因为它很早就在我尝试的每个文件中找到了。
然后进入下一步:
4、读取Globals子流,将BoundSheet8记录和SST加载到内存中。有关更多详细信息,请参阅全局。
我寻找 133(8500h),在 BOF 之后不久就找到了,很好。但问题在于接下来的两个步骤:
5、从与要打开的子流对应的BoundSheet8记录中读取前4个字节,其中包含lbPlyPos FilePointer。
6, 转到 lbPlyPos FilePointer 指定的流中的偏移量。这是工作表的 BOF 记录。
所以接下来的 4 个字节是一个指针,指向我应该去的文件中的位置。但是以任何顺序读取这些字节都会得到一个比整个文件大的数字。而且,这部分让我感到困惑:“这是工作表的 BOF 记录。”这不是我在前面的步骤中发现的吗?唔...
抱歉我的胡言乱语。我希望我说得有道理,并且有人愿意帮助我一点。
Update:好吧,我对此已经有了进一步的了解。这让我很困惑,但似乎每个记录也被读取为“大端”,即记录中的最后一个变量是文件中最早定位的变量。虽然我不知道它是否适用于可变长度的值?所以,看着this http://msdn.microsoft.com/en-us/library/dd773237%28v=office.12%29.aspx,可变长度的值被列为记录中的最后一个。但显然它们不能作为文件中的第一个,因为如果该信息在它后面,则无法知道要读入多少字节?
无论如何,如果我忽略这个值,并跳过 dt 和 A/unused 的 2 个字节,并将接下来的 4 个字节作为 uint 读取,在我的例子中,结果为 1130。将其添加到第一个 BOF 的 pos 中即可得到纸张 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 等等...
前 2 个字节是 BOF 记录 09 08,或 0809 被交换,即 2057(代表 BOF),所以其余的应该是INDEX http://msdn.microsoft.com/en-us/library/dd907627.aspx但没有意义...如果有人能帮助我解决这个问题,我将不胜感激。