代码之家  ›  专栏  ›  技术社区  ›  Purge

BIFF5-Excel-工作簿流问题(文件损坏)

  •  1
  • Purge  · 技术社区  · 15 年前

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

    为了添加格式,我必须对工作簿Globals流和工作表流执行EOF操作。当我这么做的时候,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
    

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

        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记录上。不过,我也没有任何运气弄明白这一点。任何帮助都将不胜感激!

    -亚历克斯

    2 回复  |  直到 15 年前
        1
  •  2
  •   jmcnamara    15 年前

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

    如果你 send me 我将为您调试其中一个损坏的文件,并让您知道问题所在。

        2
  •  0
  •   Larry K    15 年前

    我建议使用 Perl Excel Writer 作者:约翰·麦克纳马拉。

    我相信perl库被认为是开源Excel文件创建的“标准”。 许多其他语言的Excel作者只是约翰工作的一部分。

    也,

    推荐文章