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

biff5 excel-指向标签记录中的xf和字体记录

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

    我正在使用firefox api从我的基于javascript的firefox扩展中写入二进制文件。

    到目前为止,我完全能够将信息以biff5格式写入文件,并成功地重新调整列的大小。

    我遇到的问题是,无论我怎么尝试,我似乎都无法让标签记录中的XF索引(IXFE)指向XF记录。(或者我的XF记录有问题)

    基本上,我正在尝试将几个单元格中的字体粗细改为粗体。

    我知道我可以用for语句来清理代码,但是当我进行故障排除时,我一次只做一个记录,这样我就可以很容易地看到发生了什么。

    这就是我为美国银行写的:

    excelData[excelData.length] = pack("vvvvvv", 0x809, 0x08, 0x0500, 0x10, 0x096C, 0x07C9); // BOF Worksheet
    
    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, 0x7FFF, 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, 0x7FFF, 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, 0x7FFF, 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, 0x7FFF, 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, 0x7FFF, 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, 0x7FFF, 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, 0x7FFF, 0x02BC, 0x0000, 0x0200, 0x00, 0x01, 0x00, 7); // calibri 10 bold - index 7
    excelData[excelData.length] = "Calibri";
    
    
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0xFFF5, 0x2020, 0x20C0, 0x8140, 0x15B3, 0x2040); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0x00,   0x2020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up?
    excelData[excelData.length] = pack("vvvvvvvvvv", 0x00E0, 0x0010, 0x0006, 0x0000, 0x00,   0x2020, 0x20C0, 0x0000, 0x0000, 0x0000); //XF Messed up? // User Defined
    

    这是我为标签写的:

        excelData[excelData.length] = pack("vvvvvv", 0x0204, Number(L)+8, Row, Col, 0x11, L);
    excelData[excelData.length] = Value; // Cell Value
    

    所以,如果我没有弄错的话,标签中的0x11指向的是IXFE17,这是第16个XF记录。

    XF记录指向的是ifnt(字体索引)0x0006,即ifnt 6,或者由于索引4未使用而指向第6个字体记录。

    现在的情况是,不管我将标签记录中的IXFE或XF记录中的IFNT更改为什么,单元格仍然使用默认字体(ifnt 0)。

    我已经阅读了我能找到的每一盎司的文档,并试图对一些PHP库进行反向工程。

    在这一点上,任何指导都会非常感谢,因为我完全没有想法。

    多谢各位!

    编辑

    在过去的几个小时里,我学到了很多,谢谢你的帮助。我将发布一个关于工作簿流的新问题的新问题。

    对于任何可能跟踪此问题并有类似问题的人来说,新问题是: BIFF5 - Excel - Workbook Stream Problems (corrupt file)

    1 回复  |  直到 15 年前