我有一些使用OLEDB(Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;
)的Excel文件读取代码,该代码运行良好,但我遇到一个问题,即某些日期作为DBNull返回。
在原始XLS文档中,有效的日期格式(en-GB语言环境)为:
"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不是来自未被触发的catch):
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;
}
答案 0 :(得分:2)
我不知道这是否有用,但我遇到的问题是Excel OLEDB代码返回NULL,我期望数据,它几乎总是回到数据类型推断问题。 Excel根据前x行数据确定列的数据类型(我认为x = 10,可能是错误的)。我知道您不想更改文件,但是可能值得尝试将问题日期样式放在前10行中,看看它是否会改变应用程序的行为。
显然,如果确实修复了它,那么这并不能解决你的问题。在我知道的情况下,唯一的修复是更改文件(在前10行中放置一些强制它使用正确数据类型的东西)。抱歉,我无法提供更好的解决方案,但希望至少我能帮助您找出导致问题的原因。