【问题标题】:DataTable importRow() into empty tableDataTable importRow() 到空表中
【发布时间】:2012-06-01 19:52:22
【问题描述】:

我一直在尝试将包含许多工作表的 excel 文档合并到一个数据表中,以便我可以在我的 winform 应用程序中显示该工作表。

通过阅读,我认为 Datatable.import(DataRow row) 是我最好的选择。因此我的代码如下所示:

DataTable returnSet = new DataTable();
foreach (DataTable datTab in ds.Tables) // ds is extracted excel sheets in a dataset
{
  foreach (DataRow datRow in datTab.Rows) 
  {
    if (datRow.IsNull(0)) //if empty first col go on to next sheet
    {
      break;
    }
    else
    {
      returnSet.ImportRow(datRow);
    }
  }
}

调试时,它显示 datRow/datTab 是我所期望的,但是在每个 ImportRow 之后,returnSet 仍然是一个空的 1x1 单元格。任何关于我做错/遗漏的见解将不胜感激。

【问题讨论】:

    标签: c# .net datatable


    【解决方案1】:

    我认为原因是因为您的 DataTable 当前没有架构。您可以尝试克隆原始 DataTable 以创建相同的架构(DataColumns 等)。

    foreach (DataTable datTab in ds.Tables) // ds is extracted excel sheets in a dataset
    {
        DataTable tblClone = datTab.Clone();
        foreach (DataRow datRow in datTab.Rows) 
        {
    
            if (datRow.IsNull(0)) //if empty first col go on to next sheet
            {
                break;
            }
            else
            {
                tblClone.ImportRow(datRow);
            }
        }
    }
    

    【讨论】:

    • 他想在 DataTable 循环之外声明 tblClone DataTable,可能使用 DataSet 中的第一个 DataTable 作为模板。
    • @JayRiggs:模板是什么意思?他要跳过所有不适合第一个表的 DataColumns 吗?
    • 是的,我想返回 tblClone,但这很容易解决。谢谢您的帮助。只是一个简短的事情,有什么办法可以简单地附加在一行上?当我测试遍历上述表的多个数据表和多个数据行时,似乎当前行必须完全匹配原始模式,否则它不会添加当前行。(我用 3 个 excel 表进行测试,每个表都有一个行但是,一个有 3 列数据,另一个有 4 列,另一个有 5 列,只有 3 列行出现,即使它们在 ds 中显示正确。)
    • 我的评论措辞不当,抱歉。我相信 OP 想要将 DataSet 中的所有 DataTable 组合成一个新的 DataTable,所以我认为在你的代码中你必须在 DataTable 循环之外声明这个新的 DataTable。如果你这样做了,你需要选择一个 DataTable 来克隆,在这种情况下,我建议在 ds.Tables[0] 上使用 DataTable。不过我可能是错的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多