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

时间:2017-02-22 11:55:57

标签: c# excel openxml-sdk

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

要确定单元格是否包含数字数据,我会评估属性Cell.DataType(类型为CellValues,这是一个枚举)。 起初,似乎这个属性是确定这一点的最佳候选者。 CellValues的可能值为: Boolean,Number,Error,SharedString,String,InlineString或Date。所以我希望Cell.DataType设置为CellValues.Number。 经过一些调试后,我发现当单元格包含数字数据时,Cell.DataType为空。

在互联网上搜索找到解释时,我发现了以下MSDN文章: https://msdn.microsoft.com/en-us/library/office/hh298534.aspx

本文准确描述了我在调试过程中发现的内容:

  

Cell类型提供DataType属性,指示单元格内数据的类型。对于数字和日期类型,DataType属性的值为null。

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

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

1 个答案:

答案 0 :(得分:3)

  

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

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

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

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

  

b - 布尔

  d - 日期
  电子错误
  inlineStr - 内联字符串
   n - 数字(默认值)
  s - 共享字符串   str - 公式字符串

您可以看到"n"代表number

  

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

从上面可以看出,您可以检查Cell.DataType的空Cell.DataTypeCellValues.Number Date来判断一个单元格是否包含数字,但它不完整这很简单 - 最大的问题是日期。

似乎日期的原始存储机制是使用数字并依赖于样式来确定该数字是否实际上是数字,或者数字是否代表日期。

令人困惑的是,规范已更新为包含Date类型,但并非所有日期都将使用日期类型Number类型表示单元格包含ISO 8601格式的日期,但它对于将日期存储为具有正确样式的数字完全有效。以下XML代码段以Date<sheetData> <row r="1" spans="1:1" x14ac:dyDescent="0.25"> <c r="A1" s="1"> <v>42767</v> </c> </row> <row r="2" spans="1:1" x14ac:dyDescent="0.25"> <c r="A2" s="1" t="d"> <v>2017-02-01</v> </c> </row> </sheetData> 格式显示相同的日期(2017年2月1日):

Cell.DataType

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

The resulting Excel file

如果您需要区分日期和数字,则需要找到任何数字(Cell.DataType的{​​{1}}或CellValues.Number的{​​{1}}),然后检查这些单元格的样式确保它们是数字,而不是伪装成数字的日期。

相关问题