2017-03-13 30 views
0

我有一个从Excel工作表填充的DataTable,现在需要根据该列中的内容对数据进行操作。C#:遍历未知名称的DataTable列来检查数据

例如,如果ColumnA具有数字1,2和3的组合,则不改变该列,但如果ColumnA不具有那种组合,则应删除该列。

现在问题出现,如果我使用dataTable.Select("")方法。
我不知道列名和我将如何完成所有列,实际上跨列应用where子句。这个操作全部基于列而不是行。

如果任何人有建议或可以指向我的正确方向请做。

编辑 下面是用ExcelSheet填充DataTable的代码。

ds = new DataSet(); 
using (OleDbConnection con = new OleDbConnection(Excel07ConString)) 
{ 
    using (OleDbCommand cmd = new OleDbCommand()) 
    { 
     using (OleDbDataAdapter oda = new OleDbDataAdapter()) 
     { 
      cmd.Connection = con; 
      con.Open(); 
      DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

      for (int i = 0; i < dtExcelSchema.Rows.Count; i++) 
      { 
       sheetName = dtExcelSchema.Rows[i]["TABLE_NAME"].ToString(); 
       DataTable dt = new DataTable(); 
       cmd.Connection = con; 
       cmd.CommandText = "SELECT * FROM [" + sheetName + "]"; 
       oda.SelectCommand = cmd; 
       oda.Fill(dt); 
       dt.TableName = sheetName; 
       comboBoxData.Add(sheetName.Replace("$", "")); 
       ds.Tables.Add(dt); 
      } 
     } 
    } 
} 
+0

是列无名,因为他们的名字不是从Excel中的标题行传送来的,或者你无法从'DataTable.Columns'获取它们?这可能有助于显示迄今为止编写的代码。 – dlatikay

+0

@dlatikay列被命名,但最初填充dataTable后,我不能告诉名称和列数。我不想将这些名称硬编码,因为Excel工作表有不同的名称和格式。所以我们需要盲目地工作。我将用代码编辑问题。 –

+0

是否适用于每列的内容?那么它只会意味着迭代'foreach(dataTable.Columns中的var列){...}',并使用循环中的列名动态构建您的查询。 – dlatikay

回答

1

首先,确定列通过将规则应用于数据中每个删除:

var columnsToRemove = new List<DataColumn>(); 

foreach(var column in dataTable.Columns) 
{ 
    if(BusinessRulesSatisfied(dataTable, column) == false) 
    { 
     columnsToRemove.Add(column); 
    } 
} 

如果有必要,解决实际执行BusinessRulesSatisfied里面的名字列,你可以这样做使用column.ColumnName

然后移除发现不符合规则的列:

foreach(var column in columnsToRemove) 
{ 
    dataTable.Columns.Remove(column); 
} 

这样,列名拒之门外考虑。建议这样做,因为Excel没有严格的关系表概念,允许使用空标题和重复标题。

+0

这现在有很大的意义,我在“BusinessRulesSisisfied”上看到您传递了DataTable和列,我没有问题,但现在我将应用的规则将我们带回到如何实现查询?我错过了什么吗?我们可以进一步讨论“BusinessRulesSatisfied”吗? –

0

这是一个相对直接的方式,可以在现有的DataTable上应用额外的行过滤规则。我不知道需要应用到每一列,所以要保持我的例子简单实际的过滤规则,我认为一个简单的规则,“每列<> 1”:

string filter = ""; 
foreach (DataColumn dc in dtExcelSchema.Columns) 
{ 
    if (filter != "") 
     filter += " AND "; 

    filter += dc.ColumnName + " <> 1"; 
} 

// so at the end, filter will be a string in the form of "ColumnA <> 1 AND ColumnB <> 1 AND ColumnC <> 1" etc 
dtExcelSchema.DefaultView.RowFilter = filter;