BIFF5 – Excel – 工作簿stream问题(损坏的文件)

我成功地写了一个Excel文件,使用从我的FireFox扩展的JavaScript。 我可以得到我想要的格式和内容,但是我遇到了障碍。

为了添加格式,我必须EOF工作簿全局stream,BOF工作表stream。 当我这样做Excel表示文件已损坏。

我目前正在按照以下顺序向这些文件写入这些logging:

BOF Record (0x05 [Workbook]) WINDOW1 Record 1904 Record FONT Record (x7) XF Record (x17) BOUNDSHEET Record EOF Record BOF Record (0x10 [Worksheet]) LABEL Record EOF Record 

但是,当我打开文件在Excel中说,它是腐败的,当我打开它在OpenOffice它加载文件就好了,当我打开它与ExcelFile工作簿查看器查看logging,一切看起来不错。

下面是我在文件开头写的代码:

  excelData[excelData.length] = pack("vvvvvv", 0x809, 0x08, 0x0500, 0x05, 0x096C, 0x07C9); // BOF Workbook excelData[excelData.length] = pack("vvvvvvvvvvv", 0x003D, 0x0012, 0x0000, 0x0000, 0x25BC, 0x1572, 0x0038, 0x0000, 0x0000, 0x0001, 0x0258); // WINDOW1 excelData[excelData.length] = pack("vvv", 0x0022, 0x0002, 0x0000); // 1904 excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7); excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x0000, 0x0190, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 normal - index 0 excelData[excelData.length] = "Calibri"; excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7); excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x0000, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 1 excelData[excelData.length] = "Calibri"; excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7); excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x0000, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 2 excelData[excelData.length] = "Calibri"; excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7); excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x0000, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 3 excelData[excelData.length] = "Calibri"; excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7); excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x0000, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 5 excelData[excelData.length] = "Calibri"; excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7); excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x0000, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 6 excelData[excelData.length] = "Calibri"; excelData[excelData.length] = pack("vv", 0x0031, 0x0F+7); excelData[excelData.length] = pack("vvvvvCCCCC", 0x00C8, 0x0001, 0x0000, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 7 excelData[excelData.length] = "Calibri"; excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0000, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0000, 0x0000, 0x0001, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0x0001, 0x0020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? // User Defined var L = 0; for (var i=0; i<excelData.length; i++) { L = Number(L)+Number(excelData[i].length); } L = L+27; var data = pack("VvC", Number(L), 0x0000, 12); // BOUNDSHEET data = data+"data sheet 1"; excelData[excelData.length] = pack("vv", 0x0085, data.length); excelData[excelData.length] = data; excelData[excelData.length] = pack("vv", 0x0A, 0x00); // EOF excelData[excelData.length] = pack("vvvvvv", 0x809, 0x08, 0x0500, 0x10, 0x096C, 0x07C9); // BOF Worksheet 

我真的怀疑问题在于BOUNDSHEET纪录。 不过,我也没有什么好运气的。 任何帮助,将不胜感激!

-Alex

我是上面提到的Spreadsheet :: WriteExcel Perl模块的作者。

如果您向我发送了一个损坏的文件,我会为您进行debugging,并让您知道问题所在。

我build议使用John McNamara的Perl Excel Writer复制Excel内容。 然后比较他的sw和你的二进制输出。 你也可以尝试联系John寻求帮助。

我相信perl库被认为是开源Excel文件创build的“标准”。 其他语言的许多Excel作家只是John工作的端口。

另外,你能说更多关于你的FF扩展名写Excel文件? 听起来不错。