2015-09-01 5 views
3

У меня есть следующий код:OleDbDataReader пропускает первую запись

OleDbDataReader xlsReader = 
      new OleDbCommand("Select * from [" +spreadSheetName + "]", xlsFileConnection). 
      ExecuteReader(); 

В параметре spreadSheetName я сохранить мое имя файла.

Строка соединения для xlsFileConnection был установлен как

"Provider=Microsoft.Jet.OLEDB.4.0; 
Data Source='<directory path>'; 
Extended Properties='text; HDR=No; FMT=Delimited'" 

Когда я начать выполнять while (xlsReader.Read()) я взять строку # 2, но не # 1 от источника данных.

Первое предложение состояло в том, что параметр HDR имеет недопустимое значение, но кажется, что все в порядке.

+0

Является ли ваш файл электронной таблицы Excel или CSV файла размер? Есть ли у него строка заголовка? Почему вы используете Microsoft.Jet.OLEDB.4.0, а не Microsoft.ACE.OLEDB.12.0? –

ответ

0

Есть лучше и более простые способы чтения XLSX файлов, если бы я тебя, я бы захватить closedXML от NuGet и этот код, чтобы прочитать ваш Excel файл в таблицу данных

public void ProcessExcel(string fileName) 
    { 
     _dt = ImportSheet(fileName); 
     dgContacts.ItemsSource = _dt.DefaultView; 
    } 

public static DataTable ImportSheet(string fileName) 
    { 
     var datatable = new DataTable(); 
     var workbook = new XLWorkbook(fileName); 
     var xlWorksheet = workbook.Worksheet(1); 
     var range = xlWorksheet.Range(xlWorksheet.FirstCellUsed(), xlWorksheet.LastCellUsed()); 

     var col = range.ColumnCount(); 
     var row = range.RowCount(); 

     datatable.Clear(); 
     for (var i = 1; i <= col; i++) 
     { 
      var column = xlWorksheet.Cell(1, i); 
      datatable.Columns.Add(column.Value.ToString()); 
     } 

     var firstHeadRow = 0; 
     foreach (var item in range.Rows()) 
     { 
      if (firstHeadRow != 0) 
      { 
       var array = new object[col]; 
       for (var y = 1; y <= col; y++) 
       { 
        array[y - 1] = item.Cell(y).Value; 
       } 

       datatable.Rows.Add(array); 
      } 
      firstHeadRow++; 
     } 
     return datatable; 
    } 

грейфера данные из ваш тип данных, который вам нужен.

Это живое и рабочий код, так что вам просто нужно скопировать и вставить

+0

ОП спросил об OleDb, а не в ClosedXML, так что интересно это на самом деле не отвечает на вопрос. –

+0

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