2013-05-10 5 views
0

я в настоящее время имеют следующие открытия кода и чтения в электронной таблице Excel:Выбор диапазона в рабочем листе C#

var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", fileNameTextBox.Text); 
var queryString = String.Format("SELECT * FROM [{0}]",DETAILS_SHEET_NAME); 
var adapter = new OleDbDataAdapter(queryString, connectionString); 
var ds = new DataSet(); 

adapter.Fill(ds, DETAILS_SHEET_NAME); 

DataTable data = ds.Tables[DETAILS_SHEET_NAME]; 

dataGridView1.DataSource = data; 
       dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader); 

Это все хорошо, за исключением я не заинтересован в первом ряду (возможно, первые две строки, так как строка 2 - это заголовки) рабочего листа. Как я могу изменить выбор Query, чтобы выбрать диапазон, как я бы в excel?

Мне интересно читать в столбцах A-N в строках все строки из 2-х, содержащие данные.

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

+0

Пожалуйста, не повторяйте теги в заголовках вопросов. –

ответ

2

Изменить Select заявления включая только столбцы, которые необходимо вместо шаблона "*", как в следующем примере:

("SELECT Column1, Column2 FROM DETAILS_SHEET_NAME"); 

Вы можете использовать дополнительную логику, чтобы удалить ненужные строки, например, «пейджинг решение» (например, выбор строк из N в M), как показано ниже:

Предполагая, что таблица базы данных «TBL_ITEM» содержит два столбца (поля), представляющие интерес: столбец «Item», представляющий уникальный идентификатор и «ранг», который является используемый для сортировки в порядке возрастания, общая проблема поискового вызова указывается как lowing: выберите N-строки из таблицы, упорядоченной по методу ранжирования (т. пропускающие) (MN) строки:

SELECT TOP N Item, 
Rank FROM (SELECT TOP M Rank, Item FROM TBL_ITEM ORDER BY Rank) 
AS [SUB_TAB] ORDER BY Rank DESC 

Это решение и его расширений/образцы тщательно обсуждаются в моей статье Pure решение SQL в таблице базы данных пейджинга (ссылка: http://www.codeproject.com/Tips/441079/Pure-SQL-solution-to-Database-Table-Paging)

Наконец, вы можете использовать фрагмент кода, показанный ниже в листинге 2, для экспорта содержимого объекта DataTable в файл Excel с большим количеством функций настройки, которые могут быть добавлены в код;

Листинг 2. Экспорт DataTable в Excel файл (2007/2010):

internal static bool Export2Excel(DataTable dataTable, bool Interactive) 
{ 
    object misValue = System.Reflection.Missing.Value; 

    // Note: don't include Microsoft.Office.Interop.Excel in reference (using), 
    // it will cause ambiguity w/System.Data: both have DataTable obj 
    Microsoft.Office.Interop.Excel.Application _appExcel = null; 
    Microsoft.Office.Interop.Excel.Workbook _excelWorkbook = null; 
    Microsoft.Office.Interop.Excel.Worksheet _excelWorksheet = null; 
    try 
    { 
     // excel app object 
     _appExcel = new Microsoft.Office.Interop.Excel.Application(); 

     // make it visible to User if Interactive flag is set 
     _appExcel.Visible = Interactive; 

     // excel workbook object added to app 
     _excelWorkbook = _appExcel.Workbooks.Add(misValue); 

     _excelWorksheet = _appExcel.ActiveWorkbook.ActiveSheet 
      as Microsoft.Office.Interop.Excel.Worksheet; 

     // column names row (range obj) 
     Microsoft.Office.Interop.Excel.Range _columnsNameRange; 
     _columnsNameRange = _excelWorksheet.get_Range("A1", misValue); 
     _columnsNameRange = _columnsNameRange.get_Resize(1, dataTable.Columns.Count); 

     // data range obj 
     Microsoft.Office.Interop.Excel.Range _dataRange; 
     _dataRange = _excelWorksheet.get_Range("A2", misValue); 
     _dataRange = _dataRange.get_Resize(dataTable.Rows.Count, dataTable.Columns.Count); 

     // column names array to be assigned to columnNameRange 
     string[] _arrColumnNames = new string[dataTable.Columns.Count]; 

     // 2d-array of data to be assigned to _dataRange 
     string[,] _arrData = new string[dataTable.Rows.Count, dataTable.Columns.Count]; 

     // populate both arrays: _arrColumnNames and _arrData 
     // note: 2d-array structured as row[idx=0], col[idx=1] 
     for (int i = 0; i < dataTable.Columns.Count; i++) 
     { 
      for (int j = 0; j < dataTable.Rows.Count; j++) 
      { 
       _arrColumnNames[i] = dataTable.Columns[i].ColumnName; 
       _arrData[j, i] = dataTable.Rows[j][i].ToString(); 
      } 
     } 

     //assign column names array to _columnsNameRange obj 
     _columnsNameRange.set_Value(misValue, _arrColumnNames); 

     //assign data array to _dataRange obj 
     _dataRange.set_Value(misValue, _arrData); 

     // save and close if Interactive flag not set 
     if (!Interactive) 
     { 
      // Excel 2010 - "14.0" 
      // Excel 2007 - "12.0" 
      string _ver = _appExcel.Version; 

      string _fileName ="TableExport_" + 
       DateTime.Today.ToString("yyyy_MM_dd") + "-" + 
       DateTime.Now.ToString("hh_mm_ss"); 

      // check version and select file extension 
      if (_ver == "14.0" || _ver == "12.0") { _fileName += ".xlsx";} 
      else { _fileName += ".xls"; } 

      // save and close Excel workbook 
      _excelWorkbook.Close(true, "{DRIVE LETTER}:\\" + _fileName, misValue); 
     } 
     return true; 
    } 
    catch (Exception ex) { throw; } 
    finally 
    { 
     // quit excel app process 
     if (_appExcel != null) 
     { 
      _appExcel.UserControl = false; 
      _appExcel.Quit(); 
      _appExcel = null; 
      misValue = null; 
     } 
    } 
} 
+0

Плакат указал, что они хотят пропускать строки не столбцы. –

+1

Я даю решение для этого (цитата): «Я заинтересован в чтении в столбцах A-N» –

+0

@Abe Miessler: Мне просто интересно, почему вы голосуете за мой ответ? Я дал вам разумное объяснение, а также распространил мой код на вторую проблему. Rgds, –

0

Вы можете просто попросить не заголовков. Измените строку подключения, добавьте HDR=No.

Для вашей второй проблемы я нашел это post, Может быть, вы найдете это полезным.

+0

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

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