我正在使用 OleDB DataReader 从 Excel 文件中获取数据(但这个问题也出现在 DataTable.Fill 中)。问题是我有一列应该返回字符串。一切都很好并且工作正常,但最近出现了一个问题,因为列的单元格具有不同的格式。有些是数字,有些是文字。当我使用 dataReader.GetSchema() 检查时,它表明有问题的列被推断为 System.String 类型。这样做的问题是所有非文本单元格都立即设置为 null。
有没有办法建议读者该列应该只将列解析为 System.Object,而不是将其推断为 System.String 并转储所有非字符串单元格?
我使用的连接字符串是:
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" + "Extended Properties=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();
}
最佳答案
您需要将 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 以扫描所有行。这可能会损害性能。
关于.net - Excel单元格格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3081708/