Kei*_*ons 12 c# excel types oledbconnection
我正在使用OleDbConnection来查询Excel 2007电子表格.我想强制OleDbDataReader只使用字符串作为列数据类型.
系统正在查看前8行数据并将数据类型推断为Double.问题是在第9行我在该列中有一个字符串,OleDbDataReader返回一个Null值,因为它无法转换为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],它的dataType是Double.
此架构中的第7行与我遇到问题的Excel中的特定列相关联.ItemArray [5]是它的DataType列
是否可以为读者创建自定义TableSchema,以便在访问ExcelFiles时,我可以将所有单元格视为文本而不是让系统尝试推断数据类型?
我在此页面上找到了一些很好的信息:使用ADO.NET阅读Excel电子表格的提示
关于ADO.NET接口的主要特点是如何处理数据类型.(您会注意到我在阅读电子表格时一直在仔细避免返回哪些数据类型的问题.)您准备好了吗?ADO.NET扫描前8行数据,并基于此猜测每列的数据类型.然后它会尝试将该列中的所有数据强制转换为该数据类型,并在强制失败时返回NULL!
谢谢,
基思
这是我的代码的简化版本:
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所发现的那样,OLEDB使用的是Jet,它的调整方式有限.如果您设置使用OleDbConnection从Excel文件中读取,则需要将该HKLM\...\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows
值设置为零,以便系统扫描整个结果集.
也就是说,如果您愿意使用替代引擎从Excel文件中读取,您可以考虑尝试使用ExcelDataReader.它将所有列读作字符串,但允许您使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10560 次 |
最近记录: |