BIFF8 中的字体记录索引是否从零开始?
Is a font record index in BIFF8 zero-based?
我正在使用来自 https://www.codeproject.com/articles/13852/basicexcel-a-class-to-read-and-write-to-microsoft, which in turn is based on the documentation of the Excel file format from http://sc.openoffice.org/excelfileformat.pdf.
的源代码以编程方式读写 Excel 工作表
源代码支持的Excel文件格式为二进制交换文件格式第8版(BIFF8)。
Excel 文件中的一条记录是扩展格式 (XF) 记录。 XF 记录的前两个字节是 FONT 记录的索引。这就是所有文档必须说明的内容。
我的问题:这是从零开始的索引还是从 1 开始的索引?
下面是一个让我很困惑并让我思考这个问题的用例。
用例:粗体单元格
我创建了一个简单的 Excel 工作表:一个包含粗体文本的单元格。
我以编程方式读取 Excel 工作表并将所有数据转储为人类可读的格式,使用我添加到源代码中的新 dump() 方法。我发现:
- 我的单元格与 LABELSST 记录关联:
<LabelSST rowIdx=0 colIdx=0 xfRecIdx=62 sstRecIdx=0 />
- 该 LABELSST 记录引用了索引为:62
的 XF 记录
- 如果这是一个从零开始的索引,索引 62 处的 XF 记录是:
<XF fontRecIdx=20 formatRecIdx=0 protect=0x1 align=0x20 rot=0 text=0 usedAttribs=0x8 borderLines=0 color1=0x2000000 color2=0x20c0 />
- 该 XF 记录引用了索引为:20
的 FONT 记录
- 如果这是从零开始的索引,则索引 20 处的 FONT 记录为:
<Font height=220 options=0 colorIdx=9 weight=400 escType=0 uline=0 family=2 charSet=0 name="Calibri" />
- 该 FONT 记录的权重为 400。
400 的字体粗细不是我所期望的。如果我的单元格内容是粗体,那么根据文档,字体粗细应该是 700。
但是,如果 XF 记录引用索引从 1 开始的 FONT 记录,则从 1 开始的索引 20 处的 FONT 记录是:<Font height=220 options=1 colorIdx=8 weight=700 escType=0 uline=0 family=2 charSet=0 name="Calibri" />
并且该 FONT 记录确实具有 700 的权重来表示粗体。
这令人困惑。我不知道XF记录中FONT记录的索引应该是从零开始还是从1开始。
我想我在 http://sc.openoffice.org/excelfileformat.pdf 文档的其他地方找到了我自己的问题的答案。
The font with index 4 is omitted in all BIFF versions. This means the first four fonts have zero-based indexes, and the fifth font and all following fonts are referenced with one-based indexes.
如果这是真的,那么我观察到的数据就更有意义了。
我正在使用来自 https://www.codeproject.com/articles/13852/basicexcel-a-class-to-read-and-write-to-microsoft, which in turn is based on the documentation of the Excel file format from http://sc.openoffice.org/excelfileformat.pdf.
的源代码以编程方式读写 Excel 工作表源代码支持的Excel文件格式为二进制交换文件格式第8版(BIFF8)。
Excel 文件中的一条记录是扩展格式 (XF) 记录。 XF 记录的前两个字节是 FONT 记录的索引。这就是所有文档必须说明的内容。
我的问题:这是从零开始的索引还是从 1 开始的索引?
下面是一个让我很困惑并让我思考这个问题的用例。
用例:粗体单元格
我创建了一个简单的 Excel 工作表:一个包含粗体文本的单元格。
我以编程方式读取 Excel 工作表并将所有数据转储为人类可读的格式,使用我添加到源代码中的新 dump() 方法。我发现:
- 我的单元格与 LABELSST 记录关联:
<LabelSST rowIdx=0 colIdx=0 xfRecIdx=62 sstRecIdx=0 />
- 该 LABELSST 记录引用了索引为:62 的 XF 记录
- 如果这是一个从零开始的索引,索引 62 处的 XF 记录是:
<XF fontRecIdx=20 formatRecIdx=0 protect=0x1 align=0x20 rot=0 text=0 usedAttribs=0x8 borderLines=0 color1=0x2000000 color2=0x20c0 />
- 该 XF 记录引用了索引为:20 的 FONT 记录
- 如果这是从零开始的索引,则索引 20 处的 FONT 记录为:
<Font height=220 options=0 colorIdx=9 weight=400 escType=0 uline=0 family=2 charSet=0 name="Calibri" />
- 该 FONT 记录的权重为 400。
400 的字体粗细不是我所期望的。如果我的单元格内容是粗体,那么根据文档,字体粗细应该是 700。
但是,如果 XF 记录引用索引从 1 开始的 FONT 记录,则从 1 开始的索引 20 处的 FONT 记录是:<Font height=220 options=1 colorIdx=8 weight=700 escType=0 uline=0 family=2 charSet=0 name="Calibri" />
并且该 FONT 记录确实具有 700 的权重来表示粗体。
这令人困惑。我不知道XF记录中FONT记录的索引应该是从零开始还是从1开始。
我想我在 http://sc.openoffice.org/excelfileformat.pdf 文档的其他地方找到了我自己的问题的答案。
The font with index 4 is omitted in all BIFF versions. This means the first four fonts have zero-based indexes, and the fifth font and all following fonts are referenced with one-based indexes.
如果这是真的,那么我观察到的数据就更有意义了。