我正在使用OleDB DataReader从我的excel文件中获取数据(但是这个问题也出现在DataTable.Fill中)。问题是我有一个应该返回字符串的列。一切都很好并且工作但是最近出现了一个问题,因为列的单元格具有不同的格式。有些是数字,有些是文本。当我使用dataReader.GetSchema()检查时,它显示有问题的列被推断为类型System.String。这个问题是所有非文本单元格都立即设置为空。
有没有一种方法来提醒读者的是该列应该只是分析,而不是推断它是System.String和倾倒所有非串细胞列作为System.Object的?
我正在使用的连接字符串是:
string connString =“Provider = Microsoft.Jet.OLEDB.4.0;” + “数据源=”+ filePath +“;” + “扩展属性= Excel 8.0;”;
,代码是:
using ( OleDbConnection connection = new OleDbConnection( connString ) )
{
connection.Open();
foreach ( string worksheetName in worksheetNames )
{
using ( OleDbCommand command =
new OleDbCommand( "SELECT * FROM [" + worksheetName + "]", connection ) )
{
TEntity entity;
using ( OleDbDataReader dataReader = command.ExecuteReader() )
{
while ( dataReader.Read() )
{
entity = GetDataFromDataTable( dataReader );
if ( entity != null )
{
entityList.Add( entity );
}
}
}
}
}
connection.Close();
}
答案 0 :(得分:7)
您需要将IMEX或MAXSCANROWS添加到连接字符串。
MAXSCANROWS - 要扫描的行数,以确定每列的数据类型。根据找到的最大数据类型确定数据类型。如果遇到的数据与为该列猜测的数据类型不匹配,则数据类型将作为NULL值返回。
对于Microsoft Excel驱动程序,您可以输入1到16之间的数字来扫描行。该值默认为8;如果设置为0,则扫描所有行。 (超出限制的数字将返回错误。)
此外,请查看位于注册表REG_DWORD“TypeGuessRows”的[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel]。这是不让Excel仅使用前8行来猜测列数据类型的关键。将此值设置为0可扫描所有行。这可能会影响性能。
答案 1 :(得分:2)
想到两件事:
什么类型的'TEntity'。它仅限于字符串或其他类型吗?
什么类型的列表是entityList。它是Generic,还是List(TEntity)或其他类型?