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。
令人困惑的是,规范已更新,包括Date
types,但不是所有的date将使用datetypes 。 Date
types意味着单元格包含一个ISO 8601格式的date,但对于date以正确的样式存储为一个数字是完全有效的。 以下XML片段为例,显示了Number
和Date
格式的相同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中打开时看起来像这样:
如果你需要区分date和数字,那么你将需要find任何数字(空Cell.DataType
或CellValues.Number
Cell.DataType
),然后检查这些单元格的样式,以确保它们是数字,而不是date伪装成数字。