2010-06-21 156 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