C# 从导出的表中删除列

C# 从导出的表中删除列,c#,.net,C#,.net,对于我构建的应用程序,我创建了以下函数以允许表导出到csv: `protected void Export_Click(object sender, EventArgs e) { DataTable dt = (DataTable)Session["datatable"]; String names = (String)Session["names"]; DataRow total = dt.Rows[dt.Rows.Count - 1]; List<st

对于我构建的应用程序,我创建了以下函数以允许表导出到csv:

`protected void Export_Click(object sender, EventArgs e)
{
    DataTable dt = (DataTable)Session["datatable"];
    String names = (String)Session["names"];
    DataRow total = dt.Rows[dt.Rows.Count - 1]; 
    List<string> colSaved = new List<string>();

    for (int n = dt.Columns.Count -1 ; n >= 0; n--)
    {
        if (total[n].ToString() != "0")
        { 
            colSaved.Add(dt.Columns[n].ColumnName);

        }
    }

    string[] columns = colSaved.ToArray();
    DataTable newTable;
    newTable = dt.DefaultView.ToTable( false, columns);
    String[] content = new String[newTable.Rows.Count + 1];

    string temp1 = "";
    content[0] = names;

    for (int i =0; i<newTable.Rows.Count;i++)
Response.Redirect~/export/+name

}`  

其中dt是一个数据透视表。问题是,在应用程序中,我删除了值为“0”的列,但在导出的文件中,它们确实出现了。我需要一个函数来从导出的表中删除这些列。有人能帮我吗?

假设您有一个包含列a、B、C、D的DataTable,现在您需要一个包含相同行但仅包含列a、B、D的DataTable的不同实例

DataTable dt = GetTable(); //This is the table with A, B, C and D columns....

string[] columns = new string[] {"A", "B", "D"};
DataTable newTable;   // This will have only A, B, and D
newTable = dt.DefaultView.ToTable("tempTableName", false, columns);
如您所见,问题是要知道要从原始源中保留的列的名称

然后,准备字符串数组的循环可以用这种方式重写

StringBuilder sb = new StringBuilder();
sb.AppendLine(Session["names"].ToString());

foreach(DataRow r in newTable.Rows)
{
    sb.AppendLine("\"" + string.Join("\",", r.ItemArray) + "\"");
}
string name = DateTime.Now.Year + "" + DateTime.Now.Month + "" + DateTime.Now.Day + "" + DateTime.Now.Hour + "" + DateTime.Now.Minute + "" + DateTime.Now.Second + "" + DateTime.Now.Millisecond + "__" + ".csv";
System.IO.File.WriteAllText(Server.MapPath("~/export/" + name), sb.ToString());
Response.Redirect("~/export/" + name);
在上面的更新之后进行编辑,获得要保留在新表中的列的名称相对容易

List<string> colSaved = new List<string>();
for (int n = dt.Columns.Count - 1; n >= 0; n--)
{
    if (total[n].ToString() != "0")
        colSaved.Add(dt.Columns[n].ColumnName);
}
.....
.....
string[] columns = colSaved.ToArray();
这将使原始表dt和会话变量保留原始列,而新表将只包含保存的列的行

请注意,如果在集合上循环以从中移除某些元素,则最好从集合的最后一个元素开始循环到第一个元素,从集合尾部移除元素不需要调整for indexer

 protected void Export_Click(object sender, EventArgs e)
{


    DataTable dt = (DataTable)Session["datatable"];
    String names = (String)Session["names"];
    DataRow total = dt.Rows[dt.Rows.Count - 1]; //rreshti i fundit
    List<string> colSaved = new List<string>();

    for (int n = dt.Columns.Count-1; n >=0; n--)

    {

        if (total[n].ToString() != "0")  
            colSaved.Add(dt.Columns[n].ColumnName);


    }

string[] columns = colSaved.ToArray();

DataTable newTable;
newTable = dt.DefaultView.ToTable(false, columns);
StringBuilder sb = new StringBuilder();

sb.AppendLine(string.Join(",",columns.Reverse()));

foreach (DataRow r in newTable.Rows)
{

         sb.AppendLine(string.Join(",", r.ItemArray.Reverse()));
}
string name = DateTime.Now.Year + "" + DateTime.Now.Month + "" + DateTime.Now.Day + "" + DateTime.Now.Hour + "" + DateTime.Now.Minute + "" + DateTime.Now.Second + "" + DateTime.Now.Millisecond + "__" + ".csv";
System.IO.File.WriteAllText(Server.MapPath("~/export/" + name), sb.ToString());
Response.Redirect("~/export/" + name);
}


这是函数,它终于起作用了

值为“0”的列是什么意思。列没有值您在哪里删除了列?如果您的数据表中仍然有它们,那么您没有从数据表中删除它们,而是从其他地方删除它们。如果您知道删除的列的名称,那么也可以在loop@Alireza在原始数据表中,单元格具有数值。如果列的每一行仅包含0个值,则整个列将被删除。问题是,当我在CSV上导出表时,我无法删除此项columns@Steve删除的列会随着日期间隔条件的变化而变化,我会在原始数据表中删除它们,因此索引永远不会相同,这就是我遇到困难的原因OK。我明白了。在导出数据表之前可以循环并删除列吗?数据表从数据库接收数据,它们取决于我选择显示数据的日期,因此永远无法确定哪些列将被删除。它可以工作,但是,该表没有格式化,它只会生成一列表,没有格式化意味着什么。您应该有一系列的行,每行一行,其中每个字段都用双引号括起来,并用逗号分隔。问题是缺少标题,而且文本从右到左对齐……将会话[名称]添加到StringBuilder中,对于对齐方式,您可以举个例子吗?
List<string> colSaved = new List<string>();
for (int n = dt.Columns.Count - 1; n >= 0; n--)
{
    if (total[n].ToString() != "0")
        colSaved.Add(dt.Columns[n].ColumnName);
}
.....
.....
string[] columns = colSaved.ToArray();
 protected void Export_Click(object sender, EventArgs e)
{


    DataTable dt = (DataTable)Session["datatable"];
    String names = (String)Session["names"];
    DataRow total = dt.Rows[dt.Rows.Count - 1]; //rreshti i fundit
    List<string> colSaved = new List<string>();

    for (int n = dt.Columns.Count-1; n >=0; n--)

    {

        if (total[n].ToString() != "0")  
            colSaved.Add(dt.Columns[n].ColumnName);


    }

string[] columns = colSaved.ToArray();

DataTable newTable;
newTable = dt.DefaultView.ToTable(false, columns);
StringBuilder sb = new StringBuilder();

sb.AppendLine(string.Join(",",columns.Reverse()));

foreach (DataRow r in newTable.Rows)
{

         sb.AppendLine(string.Join(",", r.ItemArray.Reverse()));
}
string name = DateTime.Now.Year + "" + DateTime.Now.Month + "" + DateTime.Now.Day + "" + DateTime.Now.Hour + "" + DateTime.Now.Minute + "" + DateTime.Now.Second + "" + DateTime.Now.Millisecond + "__" + ".csv";
System.IO.File.WriteAllText(Server.MapPath("~/export/" + name), sb.ToString());
Response.Redirect("~/export/" + name);