2015-07-14 4 views
0

извлечь данные из всех листов в книге, используя следующий код:Извлечение данных из DataTable

foreach (var sheetName in GetExcelSheetNames(connectionString)) 
      { 
       if (sheetName.Contains("_")) 
       { 
       } 
       else 
       { 
        using (OleDbConnection con = new OleDbConnection(connectionString)) 
        { 

         var dataTable = new DataTable(); 
         string query = string.Format("SELECT * ,{0} as sheetName FROM [{0}]", sheetName); 
         con.Open(); 
         OleDbDataAdapter adapter = new OleDbDataAdapter(query, con); 
         try 
         { 
          adapter.Fill(dataTable); 
          ds.Tables.Add(dataTable); 
         } 
         catch { } 
        } 
       } 

Я не могу просто понять, как данные укомплектованный в DataTable: SheetName добавляется в колонке? как я могу его извлечь?

foreach (DataTable dt in ds.Tables) 
        { 
          using (SqlConnection con = new SqlConnection(consString)) 
          { 
           con.Open(); 
           for (int i = 0; i < dt.Rows.Count; i++) 
           { 

            for (int j = 0; j < dt.Columns.Count; j ++) 
            { 
//what should I write here ? 
            } 
           } 
           } 
+0

Вы отлаживали и видели, что у вас есть dt (datatable)? Он четко показывает число столбцов и строк – prasy

ответ

0

Для того, чтобы получить имя листа, используя OLEDB, вам нужно будет использовать код, который выглядит примерно так (thanks to this SO post and answer):

DataTable dtSheets = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
    List<string> sheets= new List<string>(); 
    foreach (DataRow dr in dtSheets.Rows) 
    { 
     if (dr["TABLE_NAME"].ToString().Contains("$"))//checks whether row contains '_xlnm#_FilterDatabase' or sheet name(i.e. sheet name always ends with $ sign) 
     { 
      sheets.Add(dr["TABLE_NAME"].ToString()); 
     } 
    } 

Ниже приведен как доступ значения из DataTable:

var someValue = dt.Rows[i][j] 

Вам нужно получить элемент в столбце index (j) строки в индексе строки (i) текущего datatable (dt).

И наоборот, вы также можете использовать имя столбца.

var someValue = dt.Rows[i]["columnName"] 
+0

dt.Rows [i] [j] не возвращает имя листа –

+0

@canadacanada: поэтому ваш вопрос заключается не в том, как получить доступ к данным, загружаемым в данные, а в том, где/как загружаются листы – Veverke

+0

@ canadacanada no, который вернет значение ячейки. Поэтому, если вы находитесь в индексе строк 2 и индексе столбца 1, вы получите значение ячейки C2 в простом примере excel. – JasonWilczak

0

предполагая DT ваш DataTable переменной,

сделать dt.Rows[row index][column index]

как

дт [2] [4] -> будет ссылаться на 2-й ряд, 4-й ячейки

Я не уверен, но, возможно, имя листа может быть сохранено на dt.TableName

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