Excel单元格格式问题

时间:2010-06-21 01:46:37

标签: .net excel oledb

我正在使用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();
}

2 个答案:

答案 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)

想到两件事:

  1. 什么类型的'TEntity'。它仅限于字符串或其他类型吗?

  2. 什么类型的列表是entityList。它是Generic,还是List(TEntity)或其他类型?