OpenXML SDK2.5(Excel):如何确定单元格是否包含数值?

我忙于开发一个从MS Excel(2016)文件导入数据的组件。 该组件使用MS OpenXML SDK2.5库。 MS Excel的最终用户安装基于荷兰国家/地区设置。 该文件包含一个包含财务数据(数字)的列。 这个专栏的位置是事先不知道的。

为了确定一个单元格是否包含数字数据我计算Cell.DataType属性(CellValuestypes,它是一个枚举)。 起初看来,这个属性是完美的候选人来确定这一点。 CellValues可能的值是:Boolean,Number,Error,SharedString,String,InlineString或Date。 所以我期望Cell.DataType设置为CellValues.Number。 经过一些debugging后,我发现当单元格包含数字数据时,Cell.DataType为null。

当在互联网上searchfind解释我find以下MSDN文章: https : //msdn.microsoft.com/en-us/library/office/hh298534.aspx

这篇文章描述了我在debugging过程中所发现的:

Celltypes提供了一个DataType属性,用于指示单元格内数据的types。 对于数字和datetypes,DataType属性的值为null。

有谁知道为什么Cell.DataType没有分别与CellValues.Number或CellValues.Date初始化?

确定单元格是否包含数值的最佳方法是什么?

有谁知道为什么Cell.DataType没有分别与CellValues.Number或CellValues.Date初始化?

从这里查看 ECMA-376标准, Cell的(缩写)XSD如下所示:

 <xsd:complexType name="CT_Cell"> ... <xsd:attribute name="t" type="ST_CellType" use="optional" default="n"/> ... </xsd:complexType> 

该属性表示types。 请注意,它是可选的,默认值为"n" 。 第18.18.11节ST_CellType(单元types)列出了以下types的有效值:

b – 布尔值
d – date
电子错误
inlineStr – 一个内联string
n – 数字(默认)
s – 一个共享stringstr – 一个公式string

你可以看到"n"代表一个number

确定单元格是否包含数值的最佳方法是什么?

从上面看来,你可以检查一个Cell.DataType或者一个Cell.DataType来判断一个单元格是否包含一个数字,但是不是那么简单 – 最大的问题就是date。

看来,date的原始存储机制是使用一个数字,并依靠风格来知道数字是否实际上是一个数字,或者如果数字代表一个date。

令人困惑的是,规范已更新,包括Datetypes,但不是所有的date将使用datetypesDatetypes意味着单元格包含一个ISO 8601格式的date,但对于date以正确的样式存储为一个数字是完全有效的。 以下XML片段为例,显示了NumberDate格式的相同date(2017年2月1日):

 <sheetData> <row r="1" spans="1:1" x14ac:dyDescent="0.25"> <cr="A1" s="1"> <v>42767</v> </c> </row> <row r="2" spans="1:1" x14ac:dyDescent="0.25"> <cr="A2" s="1" t="d"> <v>2017-02-01</v> </c> </row> </sheetData> 

在Excel中打开时看起来像这样:

生成的Excel文件

如果你需要区分date和数字,那么你将需要find任何数字(空Cell.DataTypeCellValues.Number Cell.DataType ),然后检查这些单元格的样式,以确保它们是数字,而不是date伪装成数字。