2010-09-15 111 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