将Excel中的时间格式的列转换为C#DateTime

我目前正在使用Excel C#库(Microsoft.Office.Interop.Excel)来读取一个Excel电子表格到我的C#应用​​程序。

我最初试图读取所有的单元格作为他们的原始数据,但发现date格式的单元格给我一个5位数的整数,时间格式的单元格返回一个小数。 于是我发现你可以使用Excel的C#库中内置的date转换方法,如下所示:

DateTime excelDate = (DateTime)ExcelCalcValue.ExcelDateToDateTime(workbook, Double.Parse(cell.Value.ToString())); output = excelDate.ToString("yyyy-MM-dd HH:mm"); 

通过用各种testing表debugging我的应用程序,我已经能够logging单元格格式不同的格式string。 这些如下:

 (WorksheetCell.CellFormat.FormatString) Times [$-F400]h:mm:ss\\ AM/PM hh:mm:ss;@ h:mm:ss;@ [$-409]hh:mm:ss\\ AM/PM;@ [$-409]h:mm:ss\\ AM/PM;@ Dates m/d/yy [$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy dd/mm/yyyy;@ dd/mm/yy;@ d/m/yy;@ d\\.m\\.yy;@ yyyy\\-mm\\-dd;@ [$-809]dd\\ mmmm\\ yyyy;@ [$-809]d\\ mmmm\\ yyyy;@ 

使用这些,我现在可以可靠地确定在Excel中单元格的格式化风格。 使用较早的代码,我可以检测date格式的单元格,并以DateTime格式返回适当的数据。 但是,我看不到转换时间格式单元格的等效函数。

当我读取格式为[$-F400]h:mm:ss\\ AM/PM格式的单元格时,得到0.58368055555555554的结果。 我绝对不知道如何将其转换为DateTime ,或者实际上这个float是什么意思。

任何人都可以提出一个方法转换时间格式的Excel单元格(这是存储为一个奇怪的浮动)到正确的DateTimevariables?

正如FrankPI所说,使用DateTime.FromOADate() 。 您可以将此函数与Excel单元格的原始数据一起使用 – 不需要parsing格式。

Excel将其date和时间编码为双精度。 积分部分表示1900年1月1日以后的日子。分数部分表示自引用日子午夜以来的时间。 例如:

1.5 is January 1, 1900 @ Noon

41507.25 = August 21, 2013 @ 6:00 am

有关此function的更多信息,请参阅MSDN文档:

http://msdn.microsoft.com/en-us/library/system.datetime.fromoadate.aspx

“奇怪的浮动”也可以通过DateTime.FromOADate()方法转换成DateTime 。 实际上,自1900年1月1日以来,这个时间是分数的时间,例如0.04236 = 1/24 + 1/(24 * 60)分, 0.04236 = 1/24 + 1/(24 * 60)