将GridView数据导出为CSV文件

12
我在ASP.Net 2.0中使用了GridView控件,需要将其中的数据导出为CSV文件。
我已经使用DataSet绑定了这个GridView。在将数据集绑定到GridView之后,我对GridView的数据进行了一些更改,例如如果数据集中为0,则在GridView中显示为“Started”,如果数据集中为1,则在GridView中显示为“Not Started”。
因此,我无法直接使用数据集进行导出。我需要的是用C#编写导出GridView数据(而非数据集)到CSV文件的代码。
3个回答

31

试用以下代码,我已经多次使用它了。它将直接从网格视图导出数据到在代码中指定的csv文件中。

protected void btnExportCSV_Click(object sender, EventArgs e)
{
    Response.Clear();
    Response.Buffer = true;
    Response.AddHeader("content-disposition",
     "attachment;filename=GridViewExport.csv");
    Response.Charset = "";
    Response.ContentType = "application/text";

    GridView1.AllowPaging = false;
    GridView1.DataBind();

    StringBuilder sb = new StringBuilder();
    for (int k = 0; k < GridView1.Columns.Count; k++)
    {
        //add separator
        sb.Append(GridView1.Columns[k].HeaderText + ',');
    }
    //append new line
    sb.Append("\r\n");
    for (int i = 0; i < GridView1.Rows.Count; i++)
    {
        for (int k = 0; k < GridView1.Columns.Count; k++)
        {
            //add separator
            sb.Append(GridView1.Rows[i].Cells[k].Text + ',');
        }
        //append new line
        sb.Append("\r\n");
    }
    Response.Output.Write(sb.ToString());
    Response.Flush();
    Response.End();
}

欲了解更多信息请访问此处。 希望这能对您有所帮助。


3
谢谢,我尝试过这个方法,但只得到了表头列的名称,而没有这些列中的数据。 - jitendra
我得到了列数大于0的结果,但是同样的问题是我没有得到行数大于0的结果。 - jitendra
1
遇到了输出数据为空的问题。删除以下两行代码 GridView1.AllowPaging = false; GridView1.DataBind(); 后,问题得到解决!感谢您的帖子。 - Donald Gullett
我收到了Microsoft JScript运行时错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器接收到的消息。 - Welsh King
谢谢,是的,我通过将以下内容添加到PageLOAD中解决了它 ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); scriptManager.RegisterPostBackControl(CtrlExportCSV.FindControl("btnExport")); - Welsh King
显示剩余10条评论

5

首先感谢Devjosh提供的好答案,我对其进行了修改以使其适用于具有AutoGenerateColumns=true和AllowSorting=true属性的网格视图。此外,我还去除了数据中的任何逗号,以确保csv文件不会损坏。

private void ExportReport()
{
    // set the resulting file attachment name to the name of the report...
    string fileName = "test";

    Response.Clear();
    Response.Buffer = true;
    Response.AddHeader("content-disposition", "attachment;filename=" + fileName + ".csv");
    Response.Charset = "";
    Response.ContentType = "application/text";

    System.Text.StringBuilder sb = new System.Text.StringBuilder();

    // Get the header row text form the sortable columns
    LinkButton headerLink = new LinkButton();
    string headerText = string.Empty;

    for (int k = 0; k < gvReport.HeaderRow.Cells.Count; k++)
    {
        //add separator
        headerLink = gvReport.HeaderRow.Cells[k].Controls[0] as LinkButton;
        headerText = headerLink.Text;
        sb.Append(headerText + ",");
    }
    //append new line
    sb.Append("\r\n");
    for (int i = 0; i < gvReport.Rows.Count; i++)
    {
        for (int k = 0; k < gvReport.HeaderRow.Cells.Count; k++)
        {
            //add separator and strip "," values from returned content...

            sb.Append(gvReport.Rows[i].Cells[k].Text.Replace(",", "") + ",");
        }
        //append new line
        sb.Append("\r\n");
    }
    Response.Output.Write(sb.ToString());
    Response.Flush();
    Response.End();
}

1
这不适用于多个页面,就像Devjosh的那样。 - fubo
@fubo 为了使其适用于多个页面,请在该方法开头添加以下内容:gvReport.AllowPaging = false; gvReport.DataBind(); - user1914368

-1
private void ExportGridToCSV()
        {            
            Response.Clear();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", "attachment;filename=Employee.csv");
            Response.Charset = "";
            Response.ContentType = "application/text";
            GridEmployee.AllowPaging = false;
            GridEmployee.DataBind();

            StringBuilder columnbind = new StringBuilder();
            for (int k = 0; k < GridEmployee.Columns.Count; k++)
            {

                columnbind.Append(GridEmployee.Columns[k].HeaderText + ',');
            }

            columnbind.Append("\r\n");
            for (int i = 0; i < GridEmployee.Rows.Count; i++)
            {
                for (int k = 0; k < GridEmployee.Columns.Count; k++)
                {

                    columnbind.Append(GridEmployee.Rows[i].Cells[k].Text + ',');
                }

                columnbind.Append("\r\n");
            }
            Response.Output.Write(columnbind.ToString());
            Response.Flush();
            Response.End();

        }

只需在按钮单击事件中调用此方法。 如需更多代码,请单击链接 将网格视图数据导出为CSV文件

希望这可以帮助您。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接