1

I'm working on VS2008 .NET3.5 with a Office 2003 doc (.xls). I'm using Microsoft.Office.Interop.Excel to access to a document.

This works fine for my purpose but fails whenever I try to get a Date.

The way I'm using is the most common:

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

The date I have stored is 01/12/1961 (in Italian means first december and if I open excel it tolds me 1 december 1961).

When I run my app it happens that the value of the double become 15011.0 and when the finallyDate value is 2/4/1941 that's not right!

How can I solve this problem? Is there any way to convert (also manually) that 15011 number?

Thank you!!

4

2 回答 2

3

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

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

例如,查看下面的电子表格,其中 A1 包含日期:

电子表格

然后在 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被解析为动态的rangeAsValueand rangeAsValue2,并且您失去了智能感知。

于 2012-08-29T18:00:04.550 回答
0

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

确保

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

对于问题的第二部分,有没有办法(也可以手动)转换 15011 号码?

15011 实际上是从 1-1-1900 的天数。我通常只是将提到的数字除以 365 以获得粗略的日期。你会问为什么粗糙?因为有些年份有 366 天,我们需要考虑闰年。

如果您需要使用序列号准确计算日期,您可能需要使用此处找到的方法。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);
 } 

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

于 2012-08-29T17:37:53.513 回答