我正在使用 OleDb 从 Excel 文件读取数据。读取数据的代码如下:
OleDbCommand oleDbCommand = new OleDbCommand(selectCommandText, oleDbConnection);
using (OleDbDataReader dr = oleDbCommand.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(dr);
return dt;
}
Run Code Online (Sandbox Code Playgroud)
问题是读取的数据有时随机出现为字符串(例如“16.02.1995”)或类似数字时间戳(41187),类似这样将 Excel Date Serial Number 转换为 Regular Date。
有什么办法可以解决这个问题吗?我想始终以某种格式读取数据,无论它是数字还是字符串。
编辑:我发现当我打开Excel文件时,读取的日期是数字格式(日期序列号),当我没有打开文件时,日期是字符串格式。有人知道为什么吗?
Edit2:日期单元格中使用的个性化格式
要将日期数字或日期字符串转换为 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;
}
Run Code Online (Sandbox Code Playgroud)
要使用它,在您的主要测试方法中,您可以执行以下操作:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
输出将是:
16-02-1995 00:00:00
05-10-2012 00:00:00
Run Code Online (Sandbox Code Playgroud)
我已经测试过了,我也很擅长。
注意:这只是示例,您可以改进方法、更改顺序、添加更多保护线以使其不会中断,例如,如果 Excel 中的日期为空、为空或格式错误,以适应您的业务逻辑。
| 归档时间: |
|
| 查看次数: |
444 次 |
| 最近记录: |