从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为rangeAsValue
和rangeAsValue2
dynamicrangeAsValue2
,并且您失去了智能感知。
对于你的问题的第一部分, 我该如何解决这个问题?
确保
- 文件被保存。
- 您正在访问正确的单元格。
到你的问题的第二部分, 有没有办法转换(也手动)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