【问题标题】:Convert time-formatted column in excel to C# DateTime将excel中的时间格式列转换为C# DateTime
【发布时间】:2013-08-21 13:05:55
【问题描述】:

我目前正在使用 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 格式返回正确的数据。但是,我看不到转换时间格式单元格的等效函数。

当我读取时间格式为[$-F400]h:mm:ss\\ AM/PM 的单元格时,我得到0.58368055555555554 的结果。我完全不知道如何将它转换成DateTime,或者这个浮点数代表什么。

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

【问题讨论】:

  • @pnuts 我不能这样做,因为电子表格将由用户提供,当用户导入他们的电子表格时,我需要为许多不同的场景做准备。感谢您的链接!

标签: c# excel


【解决方案1】:

正如 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

【讨论】:

  • 还有 DateTime.ToOADate() 用于另一种方式
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我编写了这个函数来处理从 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;
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-09-08
        • 2014-10-26
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 2011-05-29
        • 2023-02-09
        相关资源
        最近更新 更多