【问题标题】:ASP.Net Grid Export to ExcelASP.Net 网格导出到 Excel
【发布时间】:2012-10-15 15:38:25
【问题描述】:

我正在使用以下代码将我的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 个按钮。

什么都没有发生。

【问题讨论】:

  • gvReports.DataBind();应该叫
  • 请在@MMK回答后查看编辑

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


【解决方案1】:

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

Click here

【讨论】:

  • iTextSharpt 不是仅适用于 PDF 吗?
  • 不,您也可以将 gridview 转换为 excel、word、csw 和 pdf,不受分页影响,请参阅我提供的链接。
【解决方案2】:

我的解决方案使用 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

其他一切看起来都一样,我们都使用点击事件来调用 void 函数。所以我猜,如果你做了这些改动,你的代码应该开始为你工作了。

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

【讨论】:

    【解决方案3】:

    用户控制代码:

    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 */
     }
    

    希望这能帮助您解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-13
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多