C# 当OLEDB从excel文件读取数据时,如何将自定义格式的字符串自动转换为日期时间?
我正在使用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="Excel 12.0;HDR=YES;"" /> 我有这个修复程序的工作版本,但是我很好奇是什么让C#动态类型在一列上检测DateTim
<add key="Data.Source.Connection.String"
value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[DATA_SOURCE];Extended Properties="Excel 12.0;HDR=YES;"" />
我有这个修复程序的工作版本,但是我很好奇是什么让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或记事本中显示的是什么类型,它们都是按其逻辑显示的类型,但现在您需要自己的逻辑来将所有字符串呈现给您的类型,如renderint
numbers toEnum
,感谢您的回答!今天晚些时候我会试试这个。希望结果是一致的。
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$