5

我目前正在使用 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. 我完全不知道如何将其转换为 a DateTime,或者实际上这个 float 代表什么。

谁能建议一种将时间格式的 Excel 单元格(存储为奇怪的浮点数)转换为正确DateTime变量的方法?

4

4 回答 4

12

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

Excel 将其日期和时间编码为双精度。整数部分表示 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

于 2013-08-21T13:30:54.177 回答
3

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

于 2013-08-21T13:15:02.110 回答
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;
        }
    }
}
于 2018-01-18T09:17:06.743 回答
0

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

 DateTime dateNow = DateTime.Now;
 DateTime formatedDate = DateTime.TryParse("datestringvalue", out dateNow) ? Convert.ToDateTime("datestringvalue") : DateTime.FromOADate(Convert.ToDouble("datestringvalue"));
于 2018-04-27T06:05:02.273 回答