2010-06-21 10 views
1

동일한 문제가 있습니다. 하지만 차이점은 빈 행이 중간에 있고 열이 50 개 이상 있다는 점입니다. 사용자가 중복 된 행을보고 싶어하므로 SELECT DISTINCT * FROM [Excel]Excel에서 DataTable의 빈 행을 제거하려면 어떻게해야합니까?

아무 곳이나 될 수 있습니다. 지금까지 직면 한 가장 큰 Excel은 100,000 개가 넘습니다.

빈 행을 제거하는보다 효율적인 방법이 있습니까? 아니면 각 행의 모든 ​​열을 확인하고 반복해야합니까?

dataTable = dataTable.Rows.Cast<DataRow>(). 
    Where(row => !row.ItemArray.All(field => field is System.DBNull || 
      string.Compare((field as string).Trim(), string.Empty) == 
                 0)).CopyToDataTable(); 

사전 실현하려

하나의 방법 :

void SelectDataFromExcel() 
     { 

      string connectionString = ConfigurationSettings.AppSettings["ExcelConn"].ToString(); 
      OleDbConnection excelConnection = new OleDbConnection(connectionString); 
      excelConnection.Open(); 
      OleDbCommand dbCommand; 
      OleDbDataAdapter dataAdapter; 
      foreach (var sheet in Sheets) 
      { 
       dbCommand = new OleDbCommand("select DISTINCT* From[" + sheet + "$]", excelConnection); 
       System.Threading.Thread.Sleep(1000); 
       this.Invoke((MethodInvoker)delegate 
       { 
        listBox1.Items.Add("Tablo ismi: " + sheet.ToUpper(CultureInfo.InvariantCulture) + " Tablo Satır Sayısı: "+ dSet.Tables[sheet].Rows[0][0].ToString()); 
       }); 
       dataAdapter = new OleDbDataAdapter(dbCommand); 
       dTable = new DataTable(); 
       dataAdapter.Fill(dTable); 
       dTable.TableName = sheet.ToUpper(CultureInfo.InvariantCulture);; 

       ArrangedDataList(dTable); 
       FillSqlTable(dTable, dTable.TableName); 
       dTable.Dispose(); 
       dataAdapter.Dispose(); 
       dbCommand.Dispose(); 
      } 

      excelConnection.Close(); 
      excelConnection.Dispose(); 
      t1.Abort(); 
     }
+0

안녕 난 내가 대신 "myField"에 기록 할 수 있습니다 무엇을 당신을 위해 작동하는 경우 –

+0

그나마 그것을 인정으로 답을 표시하는 것을 잊지 및 upvote에 난 내 편집 대답에 붙여 넣은있는 이것에 대한 해결책 .... –

답변

4

편집

이것은 각각의 열은 아무것도 또는 공백 하나를 포함하지있어 모든 행을 제거합니다 빈 값을 확인하는 것입니다.

DataView dv = null; 
dv = new DataView(); 

{ 
    dv.Table = myDatatable; 
    dv.AllowDelete = true; 
    dv.AllowEdit = true; 
    dv.AllowNew = true; 
    dv.RowFilter = "myField = ' '"; 
} 
+0

을 발견했다. 내 칼럼의 집계는 60 점 이상! : – Penguen

+0

테이블 열의 이름 –

+0

더 많은 열을 사용하려면 어떻게해야합니까? – Penguen

관련 문제