C# Excel DateTime返回为DBNull
我有一些使用OLEDB Provider=Microsoft.Jet.OLEDB.4.0的Excel文件读取代码;数据源={0};扩展属性=Excel 8.0;这很好,但我一直遇到一个问题,即某些日期返回为DBNull 在原始XLS文档中,在GB语言环境下工作的日期格式为:C# Excel DateTime返回为DBNull,c#,excel,oledb,C#,Excel,Oledb,我有一些使用OLEDB Provider=Microsoft.Jet.OLEDB.4.0的Excel文件读取代码;数据源={0};扩展属性=Excel 8.0;这很好,但我一直遇到一个问题,即某些日期返回为DBNull 在原始XLS文档中,在GB语言环境下工作的日期格式为: "02/04/2009 17:00:00" // returned as a System.DateTime 但以下样式失败: "08/Jan/09 11:24 AM" // returned as DBNull Ex
"02/04/2009 17:00:00" // returned as a System.DateTime
但以下样式失败:
"08/Jan/09 11:24 AM" // returned as DBNull
Excel知道它们都是日期,但我无法强制它们正确设置样式,因为下面正确显示了日期:
=DATE(YEAR(c),MONTH(c),DAY(c)) // where c = cell reference.
有没有一种方法可以在不改变自动生成的原始数据的情况下获取数据
编辑以供参考,下面是我的读取数据方法,假设已经设置了dbAdapter-注意DBNull不是来自根本没有触发的捕获:
public List<List<string>> GetData(string tableName, int maxColumns)
{
List<List<string>> rows = new List<List<string>>();
DataSet ExcelDataSet = new DataSet();
dbCommand.CommandText = @"SELECT * FROM [" + tableName + "]";
dbAdapter.Fill(ExcelDataSet);
DataTable table = ExcelDataSet.Tables[0];
foreach (DataRow row in table.Rows)
{
List<string> data = new List<string>();
for (int column = 0; column < maxColumns; column++)
{
try
{
data.Add(row[column].ToString());
}
catch (Exception)
{
data.Add(null);
}
}
// Stop processing at first blank row
if ( string.IsNullOrEmpty(data[0]) ) break;
rows.Add(data);
}
return rows;
}
我不知道这是否有帮助,但我遇到了Excel OLEDB代码返回空值的问题,在这里我需要数据,它几乎总是返回到数据类型推断问题。Excel根据前x行数据确定列的数据类型,我认为x=10可能是错误的。我知道您不想更改文件,但可能值得尝试将问题日期样式放在前10行,看看它是否会更改应用程序的行为
显然,如果它确实解决了问题,那么这并不能解决你的问题。据我所知,在这种情况下,唯一的修复方法是修改文件,在前10行中放入一些内容,强制它使用正确的数据类型。很抱歉,我无法提供更好的解决方案,但希望至少我能帮助您找出问题的原因。您是如何从XLS文档中获取日期的?你能发一段代码片段让我们看看你在做什么吗?事实上,这是有区别的,因为1月23日之前的数据使用了一种格式,之后的数据使用了另一种格式。更改数据顺序仍然会在数据切换点导致错误,但切换方向相反。我可能需要改为使用CSV…如果更改原始文件是一个选项,您可以在靠近顶部的列中放置一个明显的字符串值,从而强制将该列解析为字符串。然后在代码中自己转换为DateTime。不是最好的选择,但它很有效…不,不是一个选择。我正在尝试创建一个报告系统,供非技术人员使用,他们会弄错的。我切换到解析为Csv自动转换Excel,并且可以,正如您所说,直接解析文本。