ASP.Net Grid导出到Excel

时间:2012-10-15 15:38:25

标签: c# asp.net gridview export-to-excel

我使用以下代码将GridView导出到Excel

string attachment = "attachment; filename=Contacts.xls";
Response.ClearContent();
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/ms-excel";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
gvReports.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();

此代码是从this网站复制的。我已按照所有说明进行操作,但执行后没有任何反应。没有例外(我认为,除了Thread.Abort,因为Response.End())。

我也使用过Response.Flush()但没有任何事情发生,没有异常或文件等。

感谢。

编辑现在代码如下:

我的GridView处于控制状态。控件在asp.net页面上,该页面有以下方法。

public override void VerifyRenderingInServerForm(Control control)
{

}

点击ascx控件中的按钮事件:

protected void btnExportToExcel_Click(object sender, EventArgs e)
{
  ExportToExcel();
}

private void ExportToExcel()
{
    Response.Clear();
    Response.Buffer = true;
    Response.AddHeader("content-disposition",
      "attachment;filename=GridViewExport.xls");
    Response.Charset = "";
    Response.ContentType = "application/vnd.ms-excel ";
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);
    gvReports.AllowPaging = false;
    gvReports.DataBind();
    gvReports.RenderControl(hw);
    Response.Output.Write(sw.ToString());
    Response.Flush();
    Response.End();
}

gvReports没有链接,复选框等5个绑定列和1个按钮。

什么都没发生。

3 个答案:

答案 0 :(得分:0)

UserControl代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

public partial class WebUserControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
            this.gridView.DataSource = this.SqlDataSource1;
            this.gridView.DataBind();

    }
    private void excel_Export()
    {
        Response.Clear();
        Response.Buffer = true;
        Response.AddHeader("content-disposition",
          "attachment;filename=GridViewExport.xls");
        Response.Charset = "";
        Response.ContentType = "application/vnd.ms-excel ";
        StringWriter sw = new StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(sw);
        this.gridView.AllowPaging=false;
        this.gridView.DataBind();
        this.gridView.RenderControl(hw);
        Response.Output.Write(sw.ToString());
        Response.Flush();
        Response.End();
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        excel_Export();
    }
}

用户控制托管页面:

 <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
        <uc1:WebUserControl ID="WebUserControl1" runat="server" />
    </asp:Content>

你真的不需要在用户控件托管页面的代码后面跟踪事件,因为excel导出是通过包含网格视图和按钮的用户控件完成的。

 public override void VerifyRenderingInServerForm(Control control)
 {
        /* Verifies that the control is rendered */
 }

希望您能帮助解决问题。

答案 1 :(得分:0)

itextsharp dll,你会得到最好的方法来做到这一点

Click here

答案 2 :(得分:0)

我正在使用MVC3作为我的解决方案,但我用来将数据推送到excel文件的代码是:

        var grid = new GridView
        {
            DataSource = from lineItem in rows
                         select new
                         {
                             lineItem.ProjectName,
                             lineItem.Sat,
                             lineItem.Sun,
                             lineItem.Mon,
                             lineItem.Tue,
                             lineItem.Wed,
                             lineItem.Thu,
                             lineItem.Fri
                         }
        };
        var fileName = string.Format("{0}:{1}", userName, timesheetDate);
        grid.DataBind();

        Response.ClearContent();
        Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".xls");
        Response.ContentType = "application/msexcel";
        var sw = new StringWriter();
        var htw = new HtmlTextWriter(sw);
        grid.RenderControl(htw);
        Response.Write(sw.ToString());
        Response.End();

我看到的直接差异是:

I take my data and create a new GridView
Response.ClearContent() instead of a Response.Clear()
Response.Write instead of Response.Output.Write

其他所有内容都相同,我们都使用click事件来调用void函数。所以我猜你如果做了那些改动,你的代码就应该开始为你工作了。

自从我实施此解决方案已经有一段时间了,我找不到我得到的网站,所以我无法向您展示我的原始资源。对于那个很抱歉。

相关问题