将提取的date从Excel中转​​换为SQLdate

我正在使用C#中的互操作从Excel电子表格提取数据,我有一个小问题,我不能想到一个答案。

当我使用此代码提取date单元格的数据时:

string _date = xlWorksheet.get_Range("B3", "B3").Value2.ToString().Trim(); 

我得到了40694的值,它不会直接通过插入statemwnt直接进入SQL。

我也试过了:

 DateTime _date = Convert.ToDateTime(xlWorksheet.get_Range("B3", "B3").Value2.ToString().Trim()); 

但是,这回来与一个错误说,它不能转换它。

任何人都可以告诉我如何做到这一点?

使用DateTime.FromOADate()

使用你的例子: DateTime _date = DateTime.FromOADate(Double.Parse(xlWorksheet.get_Range("B3", "B3").Value2))

Excel的内部date值是“纪元以来的天数”,这取决于它是在PC还是Mac模式(PC版本使用1/1/1900,Mac版本使用1/1/1904),然后有一个额外的设置是与Lotus 1-2-3存在一些闰年问题兼容的bug。 转换这个数字需要您检查电子表格是基于Windows还是Mac,以及1-2-3 compat标志是否打开。

将Excel格式化为一个明确的string(如1-jan-1904),然后将其parsing回SQL Server中的date时间值,而不是试图复制Excel复杂的date处理逻辑,可能会更好。

使用DateTime.FromOADate(double d):

 DateTime.FromOADate((double)(xlWorksheet.get_Range("B3", "B3").Value2)) 

同样的事情,这里的转换

  /// <summary> /// Seriously? For the loss /// <see cref="http://www.debugging.com/bug/19252"></see> /// </summary> /// <param name="excelDate">Number of days since 1900-01-01</param> /// <returns>The converted days to date</returns> public static DateTime ConvertXlsdtToDateTime(int excelDate) { DateTime dt = new DateTime(1899, 12, 31); // adjust for 29 Feb 1900 which Excel considers a valid date if (excelDate >= 60) { excelDate--; } return dt.AddDays(excelDate); } 

Excel将date存储为一个浮点数,计算自1900-01-01(或Mac 1904-01-01)前一天开始的天数。 如果date在1900年3月1日之前,还有一个闰年问题需要考虑。

以下代码将进行转换:

 DateTime ConvertToDateTime(Double date) { if (date < 1) throw new ArgumentException("Excel dates cannot be smaller than 1."); var epoch = new DateTime(1900, 1, 1); if (date > 60D) date -= 2; else date -= 1; return epoch.AddDays(date); }