Javascript BIFF5 Excel-指向标签记录中的XF和字体记录

Javascript BIFF5 Excel-指向标签记录中的XF和字体记录,javascript,excel,firefox-addon,Javascript,Excel,Firefox Addon,我正在使用FirefoxAPI从基于JavaScript的FireFox扩展中写入二进制文件 到目前为止,我完全能够以BIFF5格式将信息写入文件,并成功地重新调整列的大小 我遇到的问题是,无论我尝试什么,我似乎都无法让标签记录中的XF索引(ixfe)指向XF记录。(该XF记录或我的XF记录有故障) 基本上,我正在尝试将几个单元格中的字体大小更改为粗体 我知道我可以使用for语句稍微清理一下代码,但是在排除故障的同时,我一次只做一条记录,这样我就可以很容易地看到发生了什么 以下是我为BOF所写的

我正在使用FirefoxAPI从基于JavaScript的FireFox扩展中写入二进制文件

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

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

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

我知道我可以使用for语句稍微清理一下代码,但是在排除故障的同时,我一次只做一条记录,这样我就可以很容易地看到发生了什么

以下是我为BOF所写的内容:

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指向ixfe 17,这是第16条XF记录

XF记录指向0x0006的ifnt(字体索引),即ifnt 6,或者第6个字体记录,因为索引4未使用

发生的情况是,无论我将标签记录中的ixfe或XF记录中的ifnt更改为什么,单元格仍然使用默认字体(ifnt 0)

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

在这一点上,任何指导都将不胜感激,因为我完全没有想法

谢谢大家

编辑

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


对于任何可能对此进行跟踪并有类似问题的人来说,新问题是:

对于粗体,字体记录需要偏移量6处的值0x02BC。为了便于将来参考,如果您想随后添加进一步的字体样式,斜体要求偏移量2处的位掩码为0x0002,而删除线要求偏移量2处的位掩码为0x0008。如果要更改字体颜色,偏移量4指向颜色索引,偏移量8标识上标/下标,偏移量10标识下划线类型。偏移量11、12和14标识字体系列、字符集和字体名称的大小,后跟字体名称本身

您可以在以下位置找到所有选项的详细信息:

编辑

查看XF记录,您将其作为BIFF5记录而不是更高版本的BIFF8记录来编写。我在工作示例中引用的链接实际上是一个BIFF8示例

BIFF8将是:- 收割台=包装(“vv”,0x00E0,0x0014); 数据=数据包(“vvcccvvv”、fontIndex、numberFormatIndex、0xFFF5、对齐、旋转、标识+收缩到它+文本方向、属性、边框1、边框2、前景和背景颜色)

BIFF5是:- 收割台=包装(“vv”,0x00E0,0x0010); 数据=包装(“VVV”、字体索引、数字格式索引、0xFFF5、对齐、fg_和_bg_颜色、填充图案、边框1、边框2)


我承认我更习惯于使用BIFF8格式;但是通读BIFF5格式的细节,我看不出您正在编写的xf有任何明显的问题。我确实知道,在PHPExcel中,在编写新的用户定义字体记录之前,我们会显式地为预定义字体编写16个字体记录,然后始终将XF记录设置为指向用户定义字体。

Hi Mark,感谢您的回复!如果查看我提供的代码,您将看到,尽管第一个字体记录具有正常的字体重量(0x0190),但以下字体记录实际上在偏移量6中使用0x02BC。标签指向XF记录,XF记录指向使用0x02BC字节的字体记录之一。换句话说,LABEL->XF->FONT,它指向的字体记录实际上已经是粗体的。但它仍然没有将字体改为粗体。我遗漏了什么?重新阅读规范文档时,字体记录0-15保留为普通样式、行轮廓级别1-7、列轮廓级别1-7和默认单元格格式。用户定义的字体记录应为索引16及以上。根据Microsoft网站的Excel二进制文件格式规范PDF,偏移量8,标签记录中是XF记录的索引。XF记录中的偏移量4是字体记录的索引,因此如果是这种情况,我不理解为什么在实现它时它不起作用。不管怎样,正如您所建议的那样,我已经尝试将16条(所需的XF记录总数)添加到字体索引号中,但仍然不起作用。根据我的理解,XF索引和字体索引是两个不同的值。标签记录应该指向XF记录,而XF记录又指向字体记录。您所概述的Cell->XF->FONT的原理非常正确。。。正如您所认为的,问题可能出在您正在写入XF记录的值的细节上。在这个url上有一个有用的例子可能会有所帮助。好的,我对我的XFs做了一些更改,我相当确定它们是正确的。我也相当肯定我所有的索引都是正确的。我是否缺少使此功能正常工作所需的一些记录?目前我正在使用以下记录:BOF(0x10-工作表)、Window11904、FONT(x7)、XF(x17)、LABEL和EOF。每次我尝试添加样式、EXTERNSHEET或BOUNDSHEET时,它都会破坏Excel文件,因此这些是我目前仅有的记录。我是否缺少使XF/FONT正常工作所需的记录?更新:我尝试了一些测试,发现通过将BOF更改为0x05(工作簿),然后在稍后使用另一个EOF(0x10)打开工作表,可以正确工作。现在的问题是,通过这样做,Excel会将文件视为已损坏。尝试添加EXTERNSHEET和BOUNDSHEET记录并不能解决问题。