从Excel读取的随机日期格式

5
我正在使用OleDb从Excel文件中读取数据。读取数据的代码如下:
OleDbCommand oleDbCommand = new OleDbCommand(selectCommandText, oleDbConnection);

using (OleDbDataReader dr = oleDbCommand.ExecuteReader())
{
    DataTable dt = new DataTable();
    dt.Load(dr);
    return dt;
}

问题在于读取的数据有时会随机出现为字符串(例如 "16.02.1995")或者像时间戳一样的数字(41187),类似于 convert Excel Date Serial Number to Regular Date
有没有办法解决这个问题?我希望始终按照格式读取数据,无论它是数字还是字符串。
编辑:我发现当我打开Excel文件时,读取的日期是以数字格式(日期序列号)表示的,而当我没有打开文件时,日期则以字符串格式表示。有人知道原因吗?
编辑2:日期单元格中使用的个性化格式。

Personalized format

1个回答

5

要将日期数字或日期字符串转换为C#,您需要两种不同的方法。

一种是将字符串转换为日期,另一种是将数字转换为日期格式。

因此,关于将字符串转换为日期,C#中有TryParse方法,而关于将数字转换为日期,则已经在SO上有答案

将它们结合起来,我们可以做出类似以下的操作:

public static DateTime? GetDateTime(object o)
{
    DateTime? date;
    try
    {
        date = FromStringToDate(o.ToString());
        if (date == DateTime.MinValue)
        {
            date = FromExcelSerialDate((int)o);
        }
    }
    catch (Exception e)
    {
        //log your exception
        date = null;
    }

    return date;
}

private static DateTime FromExcelSerialDate(int serialDate)
{
    if (serialDate > 59) serialDate -= 1; //Excel/Lotus 2/29/1900 bug   
    return new DateTime(1899, 12, 31).AddDays(serialDate);
}

private static DateTime FromStringToDate(string stringDate)
{
    DateTime.TryParse(stringDate, out DateTime result);
    return result;
}

为了将其应用于编程中,您可以在测试的主方法中执行以下操作:

将其应用于编程中,您可以在测试的主方法中执行以下操作:

List<object> excelData = new List<object>()
{
    "16.02.1995",
    41187,
    13131.3242,
    "",
    null
};

foreach (object o in excelData)
{
    var dateTime = GetDateTime(o);
    if (dateTime != null)
    {
        Console.WriteLine(dateTime);
    }
}

输出结果将是:

16-02-1995 00:00:00    
05-10-2012 00:00:00

我也在Excel中进行了测试。

enter image description here

注意:这只是一个示例,您可以改进方法,更改顺序,添加更多保护性代码以避免出错,例如如果日期在Excel中为null、空或格式错误,则需要适应您的业务逻辑。

不错的解决方案,但我想进一步探讨。为什么当文件关闭时读取的数据以字符串格式出现,而当文件打开时却以数字格式出现?这些格式可以更改以始终以字符串或数字格式进行读取吗?谢谢 :) - rlm96
你能否分享一个简单而小巧的Excel文件样本,让我尝试一下你所思考的内容,只是为了确保给出正确的反馈。 - Maytham Fahmi
当然,我一直在尝试复制这个问题以便更深入地扩展它,但我注意到我没有使用默认的Excel“日期”格式。我使用了一个个性化的格式,因此使用Excel“日期”格式读取的格式始终相同。问题与我使用的单元格格式有关,这似乎更加一致。 - rlm96
很好,我能理解现在问题已经解决了,我有什么误解吗?请给予建议。 - Maytham Fahmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接