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

时间:2013-08-21 13:05:55

标签: c# excel

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

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

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

通过使用各种测试表调试我的应用程序,我能够记录单元格以不同方式格式化时返回的各种格式字符串。这些如下:

(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中单元格的格式样式。使用早期的代码,我可以检测日期格式的单元格并以DateTime格式返回正确的数据。但是,我看不到转换时间格式单元格的等效函数。

当我读取时间格式为0.58368055555555554的单元格时,我得到[$-F400]h:mm:ss\\ AM/PM的结果。我完全不知道如何将其转换为DateTime,或者确实是浮动代表的。

有人建议将时间格式化的excel单元格(存储为奇怪的浮点数)转换为正确的DateTime变量吗?

4 个答案:

答案 0 :(得分:10)

正如FrankPI所说,使用DateTime.FromOADate()。您可以将此函数与来自Excel单元格的原始数据一起使用 - 无需解析格式。

Excel将其日期和时间编码为double。积分部分表示1900年1月1日之后的天数。分数部分表示从参考日的午夜起的时间。例如:

1.5 is January 1, 1900 @ Noon

41507.25 = August 21, 2013 @ 6:00 am

有关详细信息,请参阅此函数的MSDN文档:

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

答案 1 :(得分:3)

“奇怪的浮动”可能会通过DateTime方法转换为DateTime.FromOADate()。实际上,它是自1900年1月1日以来的天数,时间为分数,e。 G。凌晨1点01分0.04236 = 1/24 + 1/(24 * 60)

答案 2 :(得分:0)

我编写了这个函数来处理从Excel输入C#的日期。它处理日期单元的许多数据类型可能性:

/// <summary>
/// Returns DateTime?
/// Excel dates are double values, and sometimes, they're typical dd/mm/yyyy dates.
/// This function handles both possibilities, and the possibility of a blank date input. 
/// /// 
/// </summary>
/// <param name="inputDate"></param>
/// <returns></returns>
private static DateTime? ResolveExcelDateInput(string inputDate)
{
    double incomingDate = 0;

    DateTime incomingDateDate = new DateTime();

    // If the incoming date is a double type, parse it into DateTime
    if (Double.TryParse(inputDate, out incomingDate))
    {
        return DateTime.FromOADate(incomingDate);
    }

    // IF the incoming date value is a date type, parse it.
    var parseDateResult = DateTime.TryParse(inputDate, out incomingDateDate);

    if(parseDateResult)
    {
        // If the parse is successful return the date
        return incomingDateDate;
    }
    else
    {
        // If the parse isn't successful; check if this a blank value and set to a default value.
        if(string.IsNullOrWhiteSpace(inputDate))
        {
            return new DateTime(1901, 1, 1);
        }
        else
        {
            // Otherwise return null value so that is then handled by the validation logic.
            // log a validation result because inputDate is likely an invalid string value that has nothing to do with dates.
            return null;
        }
    }
}

答案 3 :(得分:0)

  

如果您希望日期值为双格式或日期格式,则将其转换为日期格式,然后尝试使用以下代码。 datestringvalue应该是你的输入值。

 DateTime dateNow = DateTime.Now;
 DateTime formatedDate = DateTime.TryParse("datestringvalue", out dateNow) ? Convert.ToDateTime("datestringvalue") : DateTime.FromOADate(Convert.ToDouble("datestringvalue"));
相关问题