2013-07-16 2 views
0

Я импортирую файл excel в DataTable, а затем получаю информацию, необходимую мне из каждого последующего DataRow, которые затем должны быть вставлены в список. У меня есть метод, который я вызываю, когда мне нужно импортировать файл Excel (.xlsx или .xls) в DataTable, и я использую его в 6 или 7 других местах в моей программе, поэтому я уверен, что нет любые ошибки там.Чтение файла Excel в DataTable возвращает пустые поля в DataRows

Моя проблема заключается в том, что, когда я обращаюсь к DataRow, в этом конкретном DataTable, первые несколько полей содержат значения, но все остальное равно null. Если я смотрю на него в окне Locals я могу видеть, что DataRow выглядит следующим образом:

[0] {"Some string value"} 
[1] {} 
[2] {} 
[3] {} 

Когда он должен выглядеть следующим образом:

[0] {"Some string value"} 
[1] {"Another string value"} 
[2] {"Foo"} 
[3] {"Bar"} 

Вот метод, который обрабатывает импорт:

public List<DataTable> ImportExcel(string FileName) 
     { 
      List<DataTable> _dataTables = new List<DataTable>(); 
      string _ConnectionString = string.Empty; 
      string _Extension = Path.GetExtension(FileName); 
      //Checking for the extentions, if XLS connect using Jet OleDB 
      if (_Extension.Equals(".xls", StringComparison.CurrentCultureIgnoreCase)) 
      { 
       _ConnectionString = 
        "Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=Excel 8.0"; 
      } 
      //Use ACE OleDb 
      else if (_Extension.Equals(".xlsx", StringComparison.CurrentCultureIgnoreCase)) 
      { 
       _ConnectionString = 
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0"; 
      } 

      DataTable dataTable = null; 
      var count = 0; 
      using (OleDbConnection oleDbConnection = 
       new OleDbConnection(string.Format(_ConnectionString, FileName))) 
      { 
       oleDbConnection.Open(); 
       //Getting the meta data information. 
       //This DataTable will return the details of Sheets in the Excel File. 
       DataTable dbSchema = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables_Info, null); 
       foreach (DataRow item in dbSchema.Rows) 
       { 
        //reading data from excel to Data Table 
        using (OleDbCommand oleDbCommand = new OleDbCommand()) 
        { 
         oleDbCommand.Connection = oleDbConnection; 
         oleDbCommand.CommandText = string.Format("SELECT * FROM [{0}]", 
          item["TABLE_NAME"].ToString()); 

         using (OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter()) 
         { 
           if (count < 3) 
           { 
            oleDbDataAdapter.SelectCommand = oleDbCommand; 
            dataTable = new DataTable(item["TABLE_NAME"].ToString()); 
            oleDbDataAdapter.Fill(dataTable); 
            _dataTables.Add(dataTable); 
            count++; 
           } 
         } 
        } 
       } 
      } 
      return _dataTables; 
     } 

Любые мысли?

ответ

1

Оказывается, ошибка была с документом первенствовать. Очевидно, документы Excel имеют скрытый стол, называемый Shared Strings. Именно из-за этой таблицы я не мог найти значения, которые я искал.

1

Возможно, вам потребуется добавить ;IMEX=1 в «Расширенные свойства» в строке подключения. Но, в конечном счете, чтение файлов excel с OleDb в лучшем случае неудобно. Вы должны использовать 3rd библиотеку партии, которая занимается с ними nativly как:

NPOI для XLS https://code.google.com/p/npoi/

EPPlus для XLSX http://epplus.codeplex.com/

Смежные вопросы