2010-09-15 18 views
1

Je réussis à écrire dans un fichier Excel en utilisant javascript depuis mon extension FireFox. Je peux obtenir la mise en forme, et le contenu que je veux, mais j'ai rencontré un obstacle. Pour ajouter la mise en forme, je dois EOF le Workbook Globals Stream, et BOF le flux de la feuille de travail. Quand je fais cela, Excel dit que le fichier est corrompu.BIFF5 - Excel - Problèmes de flux de classeur (fichier corrompu)

Je vous écris actuellement au dossier ces documents, dans cet ordre:

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 

Cependant quand j'ouvre le fichier dans Excel, il dit qu'il est corrompu, quand je l'ouvre dans OpenOffice il charge le document juste bien, quand je l'ouvre avec visualiseur ExcelFile Workbook pour voir les dossiers, tout va bien.

Voici le code que je vous écris au début du fichier:

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 

Je soupçonne vraiment le problème réside dans le dossier BOUNDSHEET. Cependant, je n'ai pas de chance de trouver celui-ci non plus. Toute aide serait appréciée!

-Alex

Répondre

2

Je suis l'auteur du module Spreadsheet :: WriteExcel Perl mentionné ci-dessus.

Si vous send me l'un des fichiers corrompus je vais le déboguer pour vous et vous faire savoir quel est le problème.

+0

Après avoir regardé le fichier, il semble que les informations manquantes sur le document OLE causent le problème. – jmcnamara

+0

Le calcul de décalage BOUNDSHEET * est * correct. – jmcnamara

0

Je suggère de dupliquer votre contenu Excel à l'aide du Perl Excel Writer par John McNamara. Comparez ensuite la sortie binaire de son sw et la vôtre. Vous pouvez également essayer de contacter John pour obtenir de l'aide. Je pense que perl lib est considéré comme la norme pour la création de fichiers Excel open source. De nombreux écrivains Excel dans d'autres langues sont simplement des ports du travail de John.

En outre, pouvez-vous en dire plus sur votre extension FF pour écrire des fichiers Excel? Cela semble génial.

+0

Salut, Larry, J'ai dupliqué mon travail dans quelques-unes des bibliothèques Open Source disponibles, mais il y a toujours des incohérences. L'enregistrement BOUNDSHEET nécessite la longueur des données jusqu'au nouveau BOF pour la feuille de calcul, qui est différent de fichier à fichier. Je dois m'assurer que mon calcul pour le décalage 4 de l'enregistrement BOUNDSHEET est exact. – Purge