2013-08-29 3 views
13

Я использую OLEDB поставщик данных читать первенствую файл, но проблема заключается в том, что в Excel лист некоторых cloumn имеют недопустимое значение, например, вместо номера строки там, Когда я прочитал это недопустимое значение. Я получаю пустую строку вместо фактического значения.Чтения первенствует файл с помощью поставщика OLEDB данных

enter image description here

для скриншота выше, когда я прочитал значение джон получает пустую строку.

Итак, есть ли способ прочитать это недопустимое значение?

Любая помощь будет оценена по достоинству.

Код является чтение файла Excel

private DataTable ReadExcelFile(string sheetName, string path) 
{ 

    using (OleDbConnection conn = new OleDbConnection()) 
    { 
     DataTable dt = new DataTable(); 
     string Import_FileName = path; 
     string fileExtension = Path.GetExtension(Import_FileName); 
     if (fileExtension == ".xls") 
      conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 8.0;HDR=YES;'"; 
     if (fileExtension == ".xlsx") 
      conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;'"; 
     using (OleDbCommand comm = new OleDbCommand()) 
     { 
      comm.CommandText = "Select * from [" + sheetName + "$]"; 

      comm.Connection = conn; 

      using (OleDbDataAdapter da = new OleDbDataAdapter()) 
      { 
       da.SelectCommand = comm; 
       da.Fill(dt); 
       return dt; 
      } 

     } 
    } 
} 

ответ

8

Вам нужно установить значение для TypeGuessRows ключа реестра в 0, таким образом, водитель будет устанавливать тип данных на основе всех значений столбца вместо первого 8 (по умолчанию).

Расположение ключа отличается от версии до версии драйвера, вы можете легко использовать Google на основе вашей конкретной версии. Например, для доступа Connectivity Engine 2007 это будет

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel 

Кстати, вам не нужно Jet для чтения файлов XLS, ACE вполне способен это также.

+5

Я думаю, вы можете сделать то же самое, установив '; IMEX = 1" 'в строку соединения после' HDR = YES'. –

+1

@DougGlancy из того, что я помню, возникла проблема с этим подходом, но это определенно стоит попытка, и если она работает, это лучше, чем редактирование реестра. –

+0

IMEX = 1 не влияет на это. См. эту тему http://stackoverflow.com/questions/10102149/what-is-imex-in-the-oledb-connection -string – Adam

5

Это работало для меня

 using (OleDbConnection conn = new OleDbConnection()) 
     { 
      DataTable dt = new DataTable(); 
      conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;MAXSCANROWS=0'"; 
      using (OleDbCommand comm = new OleDbCommand()) 
      { 
       comm.CommandText = "Select * from [" + sheetName + "$]"; 
       comm.Connection = conn; 
       using (OleDbDataAdapter da = new OleDbDataAdapter()) 
       { 
        da.SelectCommand = comm; 
        da.Fill(dt); 
        return dt; 
       } 
      } 
     } 

MAXSCANROWS = 0 переопределения по умолчанию реестра и сканирует все строки перед определением типов. IMEX = 1 все еще необходимо включить.

Например, если в этой таблице:

Header | Header 
------ | ------ 
Cell1 | 2456354 
Cell2 | 2456354 
Cell3 | 2456354 
Cell4 | 2456354 
Cell5 | 2456354 
Cell6 | 2456354 
Cell7 | 2456354 
Cell8 | 2456354 
Cell9 | A5341 

Следующие строки соединения потеряют A5341

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'" 
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;MAXSCANROWS=0'" 

Но это работает, когда у него есть и другое.