我正在使用 OleDbConnection 查询 Excel 2007 电子表格。我想强制 OleDbDataReader 仅使用字符串作为列数据类型。
系统正在查看前 8 行数据并推断数据类型为 Double。问题是,在第 9 行,该列中有一个字符串,并且 OleDbDataReader 返回 Null 值,因为它无法转换为 Double。
我使用了这些连接字符串:
提供程序=Microsoft.ACE.OLEDB.12.0;数据源=“ExcelFile.xlsx”;持久安全信息=False;扩展属性=“Excel 12.0;IMEX=1;HDR=否”
提供程序=Microsoft.Jet.OLEDB.4.0;数据源=“ExcelFile.xlsx”;持久安全信息=False;扩展属性=“Excel 8.0;HDR=No;IMEX=1”
查看 reader.GetSchemaTable().Rows[7].ItemArray[5],它的 dataType 是 Double。
此架构中的第 7 行与我遇到问题的 Excel 中的特定列相关。 ItemArray[5] 是其 DataType 列
是否可以为阅读器创建自定义 TableSchema,以便在访问 ExcelFiles 时,我可以将所有单元格视为文本,而不是让系统尝试推断数据类型?
我在此页面找到了一些很好的信息:使用 ADO.NET 读取 Excel 电子表格的提示
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);
}
}
}
}
正如您所发现的,OLEDB 使用 Jet,但它的调整方式受到限制。如果您设置使用 OleDbConnection 读取 Excel 文件,那么您需要设置HKLM\...\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows
值为零,以便系统将扫描整个结果集。
也就是说,如果您愿意使用替代引擎来读取 Excel 文件,您可以考虑尝试Excel数据阅读器。它将所有列读取为字符串,但允许您使用 dataReader.Getxxx 方法来获取键入的值。这是一个填充的示例DataSet
:
DataSet result;
const string path = @"....\Test.xlsx";
using ( var fileStream = new FileStream( path, FileMode.Open, FileAccess.Read ) )
{
using ( var excelReader = ExcelReaderFactory.CreateOpenXmlReader( fileStream ) )
{
excelReader.IsFirstRowAsColumnNames = true;
result = excelReader.AsDataSet();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)