系统查看前8行数据并推断数据类型为Double。问题是,第9行中有一个字符串,并且OleDbDataReader返回空值,因为它无法转换为Double。
我已经使用了以下连接字符串:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source="ExcelFile.xlsx";Persist Security Info=False;Extended Properties="Excel 12.0;IMEX=1;HDR=No"
Provider=Microsoft.Jet.OLEDB.4.0;Data Source="ExcelFile.xlsx";Persist Security Info=False;Extended Properties="Excel 8.0;HDR=No;IMEX=1"
查看reader.GetSchemaTable().Rows[7].ItemArray[5],它的数据类型为Double。
是否可以为读取器创建自定义TableSchema,以便在访问Excel文件时将所有单元格视为文本,而不是让系统尝试推断数据类型?
我在这个页面找到了一些有用的信息:Tips for reading Excel spreadsheets using ADO.NET
ADO.NET接口最奇怪的一点是如何处理数据类型。 (您会注意到我一直小心地避免回答读取电子表格时返回哪些数据类型的问题。)您准备好了吗? ADO.NET扫描前8行数据,并基于此猜测每个列的数据类型。然后,它尝试将该列的所有数据强制转换为该数据类型,无法进行强制转换时返回NULL!
谢谢,
Keith
以下是我代码的简化版本:
using (OleDbConnection connection = new OleDbConnection(BuildConnectionString(dataMapper).ToString()))
{
connection.Open();
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = connection;
cmd.CommandText = SELECT * from [Sheet1$];
using (OleDbDataReader reader = cmd.ExecuteReader())
{
using (DataTable dataTable = new DataTable("TestTable"))
{
dataTable.Load(reader);
base.SourceDataSet.Tables.Add(dataTable);
}
}
}
}
celldata = reader[i][i].ToString()
- rlb.usa