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

时间:2015-01-14 11:02:13

标签: c# excel openxml openxml-sdk

考虑值为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。

以下是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 mm-dd-yy
15 d-mmm-yy
16 d-mmm
17 mmm-yy
18 h:mm AM / PM
19小时:mm:ss AM / PM
20小时:mm
21小时:mm:ss
22 m / d / yy h:mm
37#,## 0;(#,## 0)
38#,## 0;红色
39#,## 0.00;(#,## 0.00)
40#,## 0.00;红色
45毫米:ss
46 [h]:mm:ss
47 mmss.0
48 ## 0.0E + 0
49 @

1 个答案:

答案 0 :(得分:1)

您正在讨论的格式被定义为样式,当创建Cell时,使用样式索引相应地设置样式索引。通过引用number format

NumberFormatId嵌入在这些样式中

Ex:在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可以用于强制字符串单元格。

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

这解释了为什么您为数字格式化的单元格获得了正确的ID,但对于一般单元格则没有