2010-06-21 121 views
6

我正在使用OleDB DataReader从我的excel文件中获取数据(但在DataTable.Fill中也出现此问题)。问题是我有一个应该返回字符串的列。一切都很好,但最近,一个问题出现了,因为该列的单元格具有不同的格式。有些是在数字和其他文字。当我使用dataReader.GetSchema()进行检查时,它显示有问题的列被推断为类型System.String。与此问题是,所有非文本单元立即设置为空。Excel单元格格式问题

有没有一种方法可以向读者建议该列应该将列解析为System.Object,而不是将其推断为System.String并转储所有非字符串单元格?

我使用的连接字符串是:

串CONNSTRING = “提供商= Microsoft.Jet.OLEDB.4.0;” + “Data Source =”+ 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(); 
} 

回答

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以扫描所有行。这可能会损害性能。

+0

谢谢。 IMEX工作。 – Jonn 2010-06-21 22:34:29

+0

仅供参考:使用Microsoft.Jet.OLEDB.4.0提供程序时将忽略MaxScanRows = 0;它仍然只扫描前8行。 Microsoft.ACE.OLEDB.12.0提供程序似乎不会遇到同样的问题。请参阅[KB](http://support.microsoft.com/default.aspx?scid=kb;en-us;257819)中_Rows到Scan_的部分 – codechurn 2012-02-09 01:37:42

2

两件事情:

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

  2. 什么类型的列表是entityList。它是通用的吗?或者它是一个列表(TEntity)还是其他类型?

+0

TEntity是一个通用类型 – Jonn 2010-06-21 22:34:52