从XLS到C#转换失败的date时间

我正在与VS2008 .NET3.5与Office 2003文档(.xls)。 我正在使用Microsoft.Office.Interop.Excel访问文档。

这工作正常我的目的,但每当我试图得到一个date失败。

我使用的方式是最常见的:

object date= xlWorkSheet.get_Range("E" + i, "E" + i).Value2; double doubleDate = double.Parse(date); DateTime finallyDate = DateTime.FromOADate(doubleDate); 

我保存的date是01/12/1961(意大利语是指12月1日,如果我打开excel,它告诉我1961年12月1日)。

当我运行我的应用程序时,碰巧double的值变成了15011.0,而finallyDate的值是2/4/1941,这是不正确的!

我怎么解决这个问题? 有什么办法来(也手动)转换15011号码?

谢谢!!

获取Value属性而不是Value2,然后您将能够使用Date对象。 您可能需要将其转换为(DateTime)。

你用Value2得到的是Date的浮点值。

例如,查看我的电子表格,其中A1包含一个date:

电子表格

然后在Excel中,我添加对Microsoft.Office.Interop.Excel的引用,并像这样获取Value和Value2属性:

 var excel = new Excel.Application(); var workbook = excel.Workbooks.Open(@"C:\Test\Test.xlsx"); var worksheet = (Excel.Worksheet)workbook.Sheets[1]; Excel.Range range = worksheet.get_Range("A1"); var rangeAsValue = range.Value; var rangeAsValue2 = range.Value2; Console.WriteLine(rangeAsValue); Console.WriteLine(rangeAsValue2); Console.ReadLine(); 

我得到这个输出:

产量

有趣的是,如果您在.Net 4.5应用程序中尝试这种方法,它仍然有效,但var的types被parsing为rangeAsValuerangeAsValue2dynamicrangeAsValue2 ,并且您失去了智能感知。

对于你的问题的第一部分, 我该如何解决这个问题?

确保

  1. 文件被保存。
  2. 您正在访问正确的单元格。

到你的问题的第二部分, 有没有办法转换(也手动)15011号码?

15011实际上是1-1-1900的天数。 我通常只是把提到的数字除以365来得到一个粗略的date。 你会问为什么粗糙? 因为有些年份有366天需要考虑闰年。

如果您需要使用序列号精确计算date,则可能需要使用此处find的方法。 http://naspinski.net/post/Translate-an-Excel-Serial-Date-into-aC-DateTime.aspx

 public DateTime ExcelSerialDateToDT(int nSerialDate) { int l = nSerialDate + 68569 + 2415019; int n = ((4 * l) / 146097); l = l - ((146097 * n + 3) / 4); int i = ((4000 * (l + 1)) / 1461001); l = l - ((1461 * i) / 4) + 31; int j = ((80 * l) / 2447); int nDay = l - ((2447 * j) / 80); l = (j / 11); int nMonth = j + 2 - (12 * l); int nYear = 100 * (n - 49) + i + l; return DateTime.Parse(nMonth + "/" + nDay + "/" + nYear); } 

您可以阅读更多关于为什么在Microsoft Office Excel上的这种行为http://www.codeproject.com/Articles/2750/Excel-serial-date-to-Day-Month-Year-and-vise-versa