首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除DataTable头

删除DataTable头
EN

Stack Overflow用户
提问于 2020-06-23 20:52:28
回答 3查看 3.4K关注 0票数 1

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

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

所以,例如:

不必要的数据

 /T1581-1998技术标准

 /T1459.2-1993自愿性、无偿性、无偿性、成品率等

 /T1459.2-1993自愿性、无偿性、无偿性、成品率等

 /T1459.2-1993自愿性、无偿性、无偿性、成品率等

 /T1459.2-1993自愿性、无偿性、无偿性、成品率等

 /T1459.2-1993自愿性、无偿性、无偿性、成品率等

将变成:

 /T1581-1998技术标准

 /T1459.2-1993自愿性、无偿性、成品率等

 /T1459.2-1993自愿性、无偿性、无偿性、成品率等

 /T1459.2-1993自愿性、无偿性、无偿性、成品率等

 /T1459.2-1993自愿性、无偿性、无偿性、成品率等

 /T1459.2-1993自愿性、无偿性、无偿性、成品率等

我做了一堆谷歌搜索和头脑风暴,我不知道如何做到这一点。

我试过:

代码语言:javascript
复制
if (DataTable1.Rows[0][0].ToString() == "Unnecessary Data")
{
    DataTable2 = DataTable1.Clone();
    DataTable2.Rows.Remove(DataTable1.Rows[0]);
}

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

代码语言:javascript
复制
if (DataTable1.Rows[0][-1].ToString() == "Unnecessary Data")
{
    DataTable2 = DataTable1.Clone();
    DataTable2.Rows.Remove(DataTable1.Rows[0]);
}

也不起作用,因为-1不是索引。有人能帮忙吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-24 00:42:45

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
var dataTable2 = dataTable1.AsEnumerable().Skip(2).CopyToDataTable();

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

票数 2
EN

Stack Overflow用户

发布于 2020-06-23 21:05:00

我构建了这个例子,没有必要克隆任何东西,希望它能有所帮助:

代码语言:javascript
复制
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];

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

代码语言:javascript
复制
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];
票数 1
EN

Stack Overflow用户

发布于 2020-06-23 22:05:50

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

如果确保将DataTable转换为DataTable of System.Data命名空间,则这段代码将修复您的问题:

代码语言:javascript
复制
DataTable.Rows[rowIndex].Delete();

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

代码语言:javascript
复制
        //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();执行之前:

代码语言:javascript
复制
First Column    Second Column

_               Redundant Row
1               First Row

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

代码语言:javascript
复制
First Column    Second Column

1               First Row

希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62543559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档