为什么在使用 OpenXml SDK 解析 excel 个单元格时单元格样式索引返回错误的 CellFormat 值?

Why does the cell style index returning wrong CellFormat value when parsing excel cells using OpenXml SDK?

考虑一个值为 39.95 的通用格式单元格。当我获取单元格的 CellFormat 时,它 returns 错误的单元格格式 -

CellFormat thisCellFormat = ((CellFormat)cellFmts.ChildElements[(int)thisCell.StyleIndex.Value]);
int fmtId = Convert.ToInt32(thisCellFormat.FormatId.Value);

返回的fmtId值为1,在某些情况下为38,应该为2或39。

此问题仅适用于通用格式单元格,我正在为数字格式单元格获取正确的 ID。

下面是Standard ECMA-376 Office Open XML File Formats指定的一组隐含单元格格式供参考-

ID 格式代码
0 一般
1 0
2 0.00
3 #,##0
4 #,##0.00
9 0%
10 0.00%
11 0.00E+00
12 # ?/?
13#??/??
14 毫米年月日
15 d-mmm-yy
16 d-嗯
17 年
18h:mmAM/PM
19 h:mm:ss AM/PM
20 h:mm
21 h:mm:ss
22m/d/yyh:mm
37 #,##0 ;(#,##0)
38 #,##0 ;红色
39#,##0.00;(#,##0.00)
40 #,##0.00;红色
45mm:ss
46[h]:mm:ss
47 mmss.0
48##0.0E+0
49@

您所说的格式被定义为样式,并且在创建 Cell 时使用样式索引相应地设置样式索引。 number format 通过引用 NumberFormatId

嵌入到这些样式中

示例:在 Open 中制作 CellFormats XML,注意区别

   CellFormat cellformat0 = new CellFormat() { FontId = 0, FillId = 0, BorderId = 0 }; // default                        
   CellFormat cellformat1 = new CellFormat() { NumberFormatId = 0 };
   CellFormat cellformat2 = new CellFormat() { NumberFormatId = 49 };    

现在cellformat1可用于普通单元格,cellformat2可用于强制字符串单元格。

因此,当您尝试在一般单元格中提取格式代码时,它可能 return 为空,因为未设置 NumberFormatId0 如果数字格式设置为通用类型。

这解释了为什么您为数字格式的单元格获得了正确的 ID 而不是为一般单元格获得了正确的 ID。