为什么使用OpenXml SDKparsingexcel单元格时,单元格样式索引返回错误的CellFormat值?

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

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

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

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

下面是标准的ECMA-376办公室开放XML文件格式指定隐含的单元格格式的参考 –

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-mmm
17毫米 – 年
18小时:毫米上午/下午
19 h:mm:ss AM / PM
20小时:毫米
21 h:mm:ss
22米/日/年:毫米
37#,## 0;(#,## 0)
38#,## 0;红色
39#,## 0.00;(#,## 0.00)
40#,## 0.00;红色
45毫米:ss
46 [h]:mm:ss
47毫米
48 ## 0.0E + 0
49 @

您正在讨论的格式被定义为样式,并且在创build单元格时,将使用样式索引来相应地设置样式索引。 number format通过引用NumberFormatIdembedded在这些样式中

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

  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可以用于强制string单元格。

因此,当您尝试在常规单元格中提取格式代码时,可能会返回null,因为NumberFormatId未设置,或者如果数字格式设置为常规types,则返回0

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