【发布时间】:2011-02-03 18:59:00
【问题描述】:
我正在使用 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 时,我可以将所有单元格视为文本,而不是让系统尝试推断数据类型?
我在这个页面找到了一些很好的信息:Tips for reading Excel spreadsheets using ADO.NET
关于 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);
}
}
}
}
【问题讨论】:
-
你能贴出你从电子表格中读取数据的代码吗?
-
感谢您提供的代码。在我看来没问题。我自己完成了这个 ADO excel 阅读器,没有任何问题。当你明确告诉它使用数据值作为字符串时,它会给你任何错误吗?
celldata = reader[i][i].ToString() -
或者,如果您使用的是 gridview 或中继器(我怀疑),是否将您的数据显式转换为字符串?
-
数据读取器本身将有问题的单元格作为 dbNull 返回。查看问题中关于 1/2 way down 的链接,它很好地解释了问题。
标签: c# excel types oledbconnection