2010-09-15 98 views
1

我成功地使用我的FireFox扩展中的javascript写入Excel文件。我可以获得格式和内容,但是我遇到了障碍。BIFF5 - Excel - 工作簿流问题(损坏的文件)

为了增加格式化,我要EOF工作簿全局Stream和BOF的工作流。当我这样做Excel表示文件已损坏。

我目前正在写的文件这些记录,按以下顺序:

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 Workbook查看器打开它以查看记录时,一切看起来都很好。

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

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

回答

2

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

如果损坏的文件,我会调试它给你,让你知道是什么问题的send me之一。

+0

查看文件后,它看起来像缺少的OLE文档信息导致该问题。 – jmcnamara 2010-09-17 08:39:48

+0

BOUNDSHEET偏移计算*是*正确的。 – jmcnamara 2010-09-17 08:40:57

0

我建议使用Perl Excel Writer由约翰·麦克纳马拉复制您的Excel内容。 然后比较他的sw和你的二进制输出。您也可以尝试联系John寻求帮助。

我相信perl的lib中被认为是“标准”对开源的Excel文件的创建。 许多其他语言的Excel编写者只是John工作的端口。

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

+0

嗨拉里,我已经在几个可用的开源库中复制了我的工作,但总是存在不一致。 BOUNDSHEET记录需要数据的长度直到工作表的新BOF,这与文件到文件不同。我需要确保我对BOUNDSHEET记录的偏移量4的计算是准确的。 – Purge 2010-09-15 04:47:11