1

我有一个 DataTable1,其中包含从 Excel 导入的一堆行。此 Excel 表的第 1 行包含与我的应用程序无关的数据。当我将此工作表导入 DataTable1 时,第一行成为标题。

我要完成的工作: 删除标题行,以便当我将 DataTable1 克隆到 DataTable2 时,DataTable1 的第二行(以前是第三行,删除之前)是 DataTable2 的标题。我不想隐藏DataTable1 的标题 - 我想完全删除它,而不必在 Excel 中手动删除它。这个标题/单元格将始终是可识别的,因为在 Excel 工作表中,第一个单元格的值实际上是“不必要的数据”。

因此,例如:

不必要的数据 | 不必要的数据 | 不必要的数据 | 不必要的数据
       列 1 | 第 2 栏 | 第 3 栏 | 第 3 栏       
           资料 | 东西 | 东西 | 东西 |
           东西 | 东西 | 东西 | 东西 |
           东西 | 东西 | 东西 | 东西 |
           东西 | 东西 | 东西 | 东西 |
           东西 | 东西 | 东西 | 东西 |



将变为:

       第 1 列 | 第 2 栏 | 第 3 栏 | 第 3 栏       
           资料 | 东西 | 东西 | 东西 |
           东西 | 东西 | 东西 | 东西 |
           东西 | 东西 | 东西 | 东西 |
           东西 | 东西 | 东西 | 东西 |
           东西 | 东西 | 东西 | 东西 |







我做了一堆谷歌搜索和头脑风暴,但我无法弄清楚如何做到这一点。

我努力了:

if (DataTable1.Rows[0][0].ToString() == "Unnecessary Data")
{
    DataTable2 = DataTable1.Clone();
    DataTable2.Rows.Remove(DataTable1.Rows[0]);
}

这不起作用,因为 Row[0] 实际上是我的标题之后的第一行。

if (DataTable1.Rows[0][-1].ToString() == "Unnecessary Data")
{
    DataTable2 = DataTable1.Clone();
    DataTable2.Rows.Remove(DataTable1.Rows[0]);
}

也不起作用,因为 -1 不是索引。任何人都可以帮忙吗?

4

3 回答 3

2

如果目标是使用第二行的值来设置 的列名dataTable1,并去掉第一行和第二行:

dataTable1.Columns.Cast<DataColumn>()
    .ToList()
    .ForEach(c => c.ColumnName = dataTable1.Rows[1][c.Ordinal].ToString());

dataTable1.Rows.RemoveAt(0);
dataTable1.Rows.RemoveAt(0);

但是,如果您需要保持dataTable1原样并创建一个新的 DataTable:

var dataTable2 = dataTable1.AsEnumerable().Skip(2).CopyToDataTable();

dataTable2.Columns.Cast<DataColumn>()
    .ToList()
    .ForEach(c => c.ColumnName = dataTable1.Rows[1][c.Ordinal].ToString());

SOA62543559

于 2020-06-24T00:42:45.483 回答
1

我建立了这个例子,不需要克隆任何东西,希望它有帮助:

var dt = new DataTable();
dt.Columns.Add("Test");
dt.Rows.Add("1");
dt.Rows.Add("2");
dt.Rows.Add("3");

dt.Rows.RemoveAt(0);
dt.Rows.RemoveAt(0);

// contains "3"
var test = dt.Rows[0].ItemArray[0];

如果您希望第二行成为标题,我会这样做,只是不确定您的类型情况是什么:

var dt = new DataTable();
dt.Columns.Add("Test");
dt.Rows.Add("1");
dt.Rows.Add("2");
dt.Rows.Add("3");

dt.Rows.RemoveAt(0);

var i = 0;
foreach(var col in dt.Rows[0].ItemArray)
{
    dt.Columns[i].ColumnName = col.ToString();
    i++;
}
dt.Rows.RemoveAt(0);

// contains "3"
var test = dt.Rows[0].ItemArray[0];
于 2020-06-23T21:05:00.833 回答
0

关于如何从 excel 文件导入 DataTable 的详细信息不足,我什至不确定您使用的 DataTable 是来自Microsoft.Office.Interop.Excel还是来自System.Data

如果您确保将您的 DataTable 转换为System.Data命名空间的 DataTable,您的问题将通过以下代码解决:

DataTable.Rows[rowIndex].Delete();

正如您在以下示例中看到的那样:

        //create a DataTable
        DataTable dataTable = new DataTable();

        //Add Columns for DataTable
        dataTable.Columns.Add(new DataColumn("First Column"));
        dataTable.Columns.Add(new DataColumn("Second Column"));

        //Add redundant DataRow and another DataRow to DataTable
        DataRow dataRow = dataTable.NewRow();
        dataRow[0] = "_";
        dataRow[1] = "Redundant Row";
        dataTable.Rows.Add(dataRow);
        dataRow = dataTable.NewRow();
        dataRow[0] = "1";
        dataRow[1] = "First Row";
        dataTable.Rows.Add(dataRow);


        //print out the DataTable before deleting redundant DataRow
        Console.WriteLine("\n" + dataTable.Columns[0] + "\t" + dataTable.Columns[1] + "\n");
        foreach (DataRow row in dataTable.Rows)
        {
            Console.WriteLine(row[0] + "\t\t" + row[1]);
        }

        //delete redundant DataRow
        dataTable.Rows[0].Delete();

        //print again the DataSet to see results
        Console.WriteLine("\n" + dataTable.Columns[0] + "\t" + dataTable.Columns[1] + "\n");
        foreach (DataRow row in dataTable.Rows)
        {
            Console.WriteLine(row[0] + "\t\t" + row[1]);
        }

代码执行后的结果是:

执行前dataTable.Rows[0].Delete();

First Column    Second Column

_               Redundant Row
1               First Row

执行后dataTable.Rows[0].Delete();

First Column    Second Column

1               First Row

我希望这能够帮到你。

于 2020-06-23T22:05:50.477 回答