将提取日期从excel转换为SQL日期

时间:2011-09-20 15:10:46

标签: c# sql .net excel

我使用C#中的interop从Excel电子表格中提取数据,我遇到了一个小问题,我无法想到答案。

当我使用以下代码提取日期单元格的数据时:

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

我得到的值为40694,不会使用我的insert statemwnt直接进入SQL。

我也尝试过:

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

但是回来的时候有一个错误,说它无法转换它。

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

5 个答案:

答案 0 :(得分:2)

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

您可能最好将Excel格式化为明确的字符串(如1-jan-1904),然后将其解析回SQL Server中的日期时间值,而不是尝试复制Excel的复杂日期处理逻辑。 / p>

答案 1 :(得分:0)

使用DateTime.FromOADate()

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

答案 2 :(得分:0)

使用DateTime.FromOADate(double d):

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

答案 3 :(得分:0)

进入同样的事情,这是转换

    /// <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);
    }

答案 4 :(得分:0)

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

以下代码将执行转换:

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);
}