我使用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());
但是回来的时候有一个错误,说它无法转换它。
任何人都可以告诉我如何做到这一点吗?
答案 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);
}