Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当OLEDB从excel文件读取数据时,如何将自定义格式的字符串自动转换为日期时间?_C#_Excel_Datetime_Oledb - Fatal编程技术网

C# 当OLEDB从excel文件读取数据时,如何将自定义格式的字符串自动转换为日期时间?

C# 当OLEDB从excel文件读取数据时,如何将自定义格式的字符串自动转换为日期时间?,c#,excel,datetime,oledb,C#,Excel,Datetime,Oledb,我正在使用OLEDB阅读Excel电子表格 <add key="Data.Source.Connection.String" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[DATA_SOURCE];Extended Properties=&quot;Excel 12.0;HDR=YES;&quot;" /> 我有这个修复程序的工作版本,但是我很好奇是什么让C#动态类型在一列上检测DateTim

我正在使用OLEDB阅读Excel电子表格

<add key="Data.Source.Connection.String"
      value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[DATA_SOURCE];Extended Properties=&quot;Excel 12.0;HDR=YES;&quot;" />
我有这个修复程序的工作版本,但是我很好奇是什么让C#
动态
类型在一列上检测
DateTime
,在另一列上检测
string
。在Excel中,它们的格式看起来是一样的

变量是C#动态类型。我用于修复此问题的当前代码:

if( !DBNull.Value.Equals( value ) ) {
    try {
        entity.Attributes.Add( "actual_time",
            Convert.ToDateTime( value ).ToUniversalTime() );
    } catch( Exception ) {
        // In case date comes across as string.
        DateTime actualTime = entity.GetAttributeValue<DateTime>(
            "actual_time" );

        int hours = Convert.ToInt32( value.ToString().Substring( 0, 2 ) );
        int minutes = Convert.ToInt32( value.ToString().Substring( 2, 2 ) );

        TimeSpan ts = new TimeSpan( hours, minutes, 0 );

        actualTime = actualTime.Date + ts;

        entity.Attributes.Add( "actual_time", actualTime );
    } // catch
} // if
如果(!DBNull.Value.Equals(Value)){
试一试{
entity.Attributes.Add(“实际时间”,
Convert.ToDateTime(value.ToUniversalTime());
}捕获(例外){
//以防日期显示为字符串。
DateTime actualTime=entity.GetAttributeValue(
“实际时间”);
int hours=Convert.ToInt32(value.ToString().Substring(0,2));
int minutes=Convert.ToInt32(value.ToString().Substring(2,2));
TimeSpan ts=新的TimeSpan(小时、分钟、0);
实际时间=实际时间.日期+ts;
添加(“实际时间”,实际时间);
}//抓住
}//如果

如果您有任何建议,我们将不胜感激。

请从以下位置查找Excel SQL语法:,这非常容易应用于您的代码

如果excel是实心格式(或生成的),请使用
类型转换
函数:

SELECT CDATE(DATETIMECOLUMN) AS DATETIMECOLUMN FROM SOMESHEET$
如果上述sql对您的情况不够好,请尝试
8。从上面的链接设置日期格式

SELECT FORMATDATETIME( [SALE_DATE], 1),   --read above link for number meanings
      FORMAT([ACTUAL_DATE], 'yyyy-mm-dd')
FROM [SALES$]
您还可以使用
IIF(IsNull(列),“默认值”,列)
来处理
null

如果您的excel可以手动编辑,格式不可靠,我会将所有数据读取为
字符串
,但用C#逻辑解析它们


您能创建一个演示您的问题的示例吗?因此,很难理解发生了什么。“在Excel中,它们在格式方面看起来是一样的”尝试查看原始列数据(在文本查看器中,而不是Excel中)。你可能会看到区别所在。@SonerGönül我已经更新了我必须修复的内容。我只是好奇为什么Excel中相同的自定义格式会在一列上检测为
DateTime
,在另一列上检测为
string
。@RonBeyer在记事本++中,它们都显示为
string
s。当您从文件中读取数据时,总是将硬编码列作为您所需的类型。所有分散的数据始终是字符串,无论Excel或记事本中显示的是什么类型,它们都是按其逻辑显示的类型,但现在您需要自己的逻辑来将所有字符串呈现给您的类型,如render
int
numbers to
Enum
,感谢您的回答!今天晚些时候我会试试这个。希望结果是一致的。
SELECT FORMATDATETIME( [SALE_DATE], 1),   --read above link for number meanings
      FORMAT([ACTUAL_DATE], 'yyyy-mm-dd')
FROM [SALES$]
SELECT CSTR(DATETIMECOLUMN) AS DATETIMECOLUMN FROM SOMESHEET$