C# Excel确定单元格的数据类型是DateTime还是Int

C# Excel确定单元格的数据类型是DateTime还是Int,c#,excel,datetime,int,C#,Excel,Datetime,Int,我正在开发一些功能,需要知道用户给定Excel电子表格中列的数据类型。这些电子表格可以有多种格式,除了第一行是列的名称外,没有标准格式。我遇到的问题是如何区分整数和日期时间列。目前,我正在使用以下函数确定单元格是否为DateTime单元格: private bool isOADate(double Val) { try { DateTime dt = DateTime.FromOADate(Val); return true;

我正在开发一些功能,需要知道用户给定Excel电子表格中列的数据类型。这些电子表格可以有多种格式,除了第一行是列的名称外,没有标准格式。我遇到的问题是如何区分整数和日期时间列。目前,我正在使用以下函数确定单元格是否为DateTime单元格:

 private bool isOADate(double Val)
 {
     try
     {
         DateTime dt = DateTime.FromOADate(Val);
         return true;
     }
     catch (ArgumentException)
     {
         return false;    
     }
 }

但是,如果单元格中有1、2、3等,此函数将返回true,因为它能够将这些值分别转换为1899/12/31 12:00:00 AM、1900/01/01 12:00:00 AM、1900/01/02 12:00:00 AM。有没有更好的方法来确定单元格的日期时间数据类型?或者您可以建议对我的当前函数进行改进,以便区分它们吗?

Excel将日期时间存储为整数。在缺少任何其他上下文的情况下,无法区分整数和日期时间。除非用户指定了一列作为日期时间;在这种情况下,您可以读取.numberformat并从中推断列的类型

Excel将日期时间存储为整数。在缺少任何其他上下文的情况下,无法区分整数和日期时间。除非用户指定了一列作为日期时间;在这种情况下,您可以读取.numberformat并从中推断列的类型

Excel中的每个单元格都包含公式、文本字符串或双数值

日期/时间只是一个数字,因此2013年1月2日的11:02是41276.45972,表示自1899年12月31日以来的天数(包括旧的Lotus 123错误,即认为1900年是闰年)

因此,如果不了解工作表的特定上下文,就无法确定单元格是否包含日期值

如果您知道日期将在某个范围内(特别是我们通常可以定义至少一个下限),那么可以增强该函数以测试最小值


此外,如果您可以使用对单元格本身的引用,并且您知道包含表示日期/时间的值的单元格将被适当地格式化,那么您可以测试
NumberFormat
属性中与日期/时间相关的内容(但在使用自定义格式的情况下,这可能会很快变得复杂).

Excel中的每个单元格都包含公式、文本字符串或双数值

日期/时间只是一个数字,因此2013年1月2日的11:02是41276.45972,表示自1899年12月31日以来的天数(包括旧的Lotus 123错误,即认为1900年是闰年)

因此,如果不了解工作表的特定上下文,就无法确定单元格是否包含日期值

如果您知道日期将在某个范围内(特别是我们通常可以定义至少一个下限),那么可以增强该函数以测试最小值


此外,如果您可以使用对单元格本身的引用,并且您知道包含表示日期/时间的值的单元格将被适当地格式化,那么您可以测试
NumberFormat
属性中与日期/时间相关的内容(但在使用自定义格式的情况下,这可能会很快变得复杂).VBA函数
Isdate()
还检查单元格格式:
27/01/2012
给出
True
,其整数等价物
40935
的结果为
False

VBA函数
Isdate()
还检查单元格格式:
27/01/2012
给出
True
,其整数等价物
40935
的结果为
False

谢谢你的回答。不幸的是,我们不能对日期设置任何限制。我确实认为答案可能在于
NumberFormat
,但是正如您所说的,定制格式可能会有问题。你能想到在
NumberFormat
中搜索
'y'
'm'
'd'
作为确定单元格是否为DateTime的一种方法会有什么问题吗?@Shane-我认为,搜索所描述的NumberFormat属性应该会起作用。当然,如果您可以使用@Jüri描述的VBA
ISDate()
函数(我不知道该函数在单元格引用中的行为),那么这也值得探索。我已经通过数字格式获得了差异。再次感谢!谢谢你的回答。不幸的是,我们不能对日期设置任何限制。我确实认为答案可能在于
NumberFormat
,但是正如您所说的,定制格式可能会有问题。你能想到在
NumberFormat
中搜索
'y'
'm'
'd'
作为确定单元格是否为DateTime的一种方法会有什么问题吗?@Shane-我认为,搜索所描述的NumberFormat属性应该会起作用。当然,如果您可以使用@Jüri描述的VBA
ISDate()
函数(我不知道该函数在单元格引用中的行为),那么这也值得探索。我已经通过数字格式获得了差异。再次感谢!你可以测试单元格的格式!在单元格中,这就是数字与日期/时间的区别。您可以在单元格的格式上进行测试!在一个单元格中,这就是数字与日期/时间的区别。谢谢你
IsDate()
似乎可以满足我的需要,但是我需要使用C语言,而且我似乎想不出一个简单的方法来实现这个函数。请尝试9票回答谢谢
IsDate()
似乎可以满足我的需要,但是我需要使用C语言,而且我似乎想不出一个简单的方法来实现这个函数。请尝试9票的答案