【问题标题】:Export current gridview data导出当前的gridview数据
【发布时间】:2014-07-03 20:57:30
【问题描述】:

我正在使用此代码导出我的 gridview 数据。我的页面中有一个下拉菜单,当我选择下拉值时,gridview 中的数据会发生变化,我只需要将当前数据导出到 excel 中。

protected void ExporttoExcel(object sender, EventArgs e)
{
    Response.Clear();
    Response.AddHeader("content-disposition", "attachment; filename=Report.xls");
    Response.ContentType = "application/vnd.xls";
    System.IO.StringWriter stringWrite = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    GridView1.RenderControl(htmlWrite);
    Response.Write(stringWrite.ToString());
    Response.End();   
}

我正在使用分页,当我最初在没有选择下拉值的情况下导出时,我需要导出所有数据,但现在只导出第一页中的数据。

谁能纠正我的错误?

【问题讨论】:

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


    【解决方案1】:

    我有一个自定义方法,用于从 Datatable-Gridvieww 以格式化样式导出 excel。您可以通过将绑定 Gridview 的数据表(分页前的整个数据表)分配给表变量来使用它

    private void ExportToExcel(DataTable table, GridView gv)
        {
    
            Response.ClearContent();
            Response.Charset = your charset//"Windows-1253";
            Response.ContentEncoding = your encoding//Encoding.UTF8;
            string attachment = "attachment; filename=test.xls";
            Response.AddHeader("content-disposition", attachment);
            Response.ContentType = "application/ms-excel";
            HttpContext.Current.Response.Write(@"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">");
    
            HttpContext.Current.Response.Write("<font style='font-size:10.0pt; font-family:Calibri;'>");
            HttpContext.Current.Response.Write("<BR><BR><BR>");
            HttpContext.Current.Response.Write("<Table border='1' bgColor='#ffffff' " +
              "borderColor='#000000' cellSpacing='0' cellPadding='0' " +
              "style='font-size:10.0pt; font-family:Calibri; background:white;'> <TR>");
            int columnscount = table.Columns.Count;
    
            for (int j = 0; j < columnscount; j++)
            {
                HttpContext.Current.Response.Write("<Td style='background-color: #C0C0C0;' align=" + "center" + ">");
                HttpContext.Current.Response.Write("<B>");
                HttpContext.Current.Response.Write(table.Columns[j].ToString());
                HttpContext.Current.Response.Write("</B>");
                HttpContext.Current.Response.Write("</Td>");
            }
            HttpContext.Current.Response.Write("</TR>");
            foreach (DataRow row in table.Rows)
            {
                HttpContext.Current.Response.Write("<TR>");
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    HttpContext.Current.Response.Write("<Td align=" + "center" + ">"); ;
                    HttpContext.Current.Response.Write(row[i].ToString());
                    HttpContext.Current.Response.Write("</Td>");
                }
    
                HttpContext.Current.Response.Write("</TR>");
            }
            HttpContext.Current.Response.Write("</Table>");
            HttpContext.Current.Response.Write("</font>");
            HttpContext.Current.Response.Flush();
            HttpContext.Current.Response.End();
        }
    

    【讨论】:

    • 我试过了,但无法将 gridview 导出到 excel。
    【解决方案2】:

    您可以将 SQL 查询结果保存在 DataTable 中,并将该 DataTable 保存在 ViewState 或 session 中。然后,当单击导出按钮时,从 ViewState 中检索 DataTable,并创建一个将 DataTable 作为其源的虚拟 GridView。

    类似这样的:

       protected void ExporttoExcel(object sender, EventArgs e)
       {
           //First, retrieve the DataTable from ViewState
           DataTable Dt = new DataTable();
           Dt = (DataTable)ViewState["DtData"];
    
           //Now you have the data, create a dummy GridView that will be used for exporting
           GridView grdView = new GridView();
           grdView.AllowPaging = false;
           grdView.DataSource = Dt;
           grdView.DataBind();
    
           //Do the Exporting stuff
           Response.Clear();
           Response.AddHeader("content-disposition", "attachment; filename=Report.xls");
           Response.ContentType = "application/vnd.xls";
           System.IO.StringWriter stringWrite = new System.IO.StringWriter();
           System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
           grdView.RenderControl(htmlWrite);
           Response.Write(stringWrite.ToString());
           Response.End();
       }
    

    这样,每次更改下拉列表的值时,将选中的 SQL 查询结果保存在数据表中,然后保存在 ViewState 中并导出。

    当然,如果您可以使用下拉列表代码更新您的问题,或者您如何设置 GridView 数据源,我会更新此答案。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      禁用GridView 分页然后渲染。您可能还需要进行绑定。

      protected void ExporttoExcel(object sender, EventArgs e)
      {
          Response.Clear();
          Response.AddHeader("content-disposition", "attachment; filename=Report.xls");
          Response.ContentType = "application/vnd.xls";
          System.IO.StringWriter stringWrite = new System.IO.StringWriter();
          System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
      
          // ************************
          GridView1.AllowPaging = false; // <- disable paging then render
          // also do the binding
          GridView1.DataSource = myDataSource;
          GridView1.DataBind();
          // ************************
      
          GridView1.RenderControl(htmlWrite);
          Response.Write(stringWrite.ToString());
          Response.End();
      }
      

      编辑(工作示例)

      ASPX(GridView 和导出 Button):

      <asp:GridView ID="grd1" runat="server" AllowPaging="true" PageSize="10" AutoGenerateColumns="false" OnPageIndexChanging="grd1_PageIndexChanging">
          <Columns>
              <asp:BoundField DataField="StudentID" HeaderText="Student ID" />
              <asp:BoundField DataField="StudentName" HeaderText="Student Name" />
              <asp:BoundField DataField="FatherName" HeaderText="Father Name" />
          </Columns>
      </asp:GridView>
      <asp:Button ID="btnExport" runat="server" Text="Export" OnClick="btnExport_Click" />
      

      代码背后:

      protected void Page_Load(object sender, EventArgs e)
      {
          if (!this.IsPostBack)
          {
              this.BindGridView();
          }
      }
      
      private void BindGridView()
      {
          using (var dtStudent = this.GetStudentData())
          {
              this.grd1.DataSource = dtStudent;
              this.grd1.DataBind();
          }
      }
      
      private DataTable GetStudentData()
      {
          var dtStudent = new DataTable();
          dtStudent.Columns.Add("StudentID");
          dtStudent.Columns.Add("StudentName");
          dtStudent.Columns.Add("FatherName");
      
          for (int i = 0; i < 20; i++)
          {
              var sIndex = i.ToString("00");
              dtStudent.Rows.Add("Student-" + sIndex, "Name-" + sIndex, "Father-" + sIndex);
          }
      
          return dtStudent;
      }
      
      protected void grd1_PageIndexChanging(object sender, GridViewPageEventArgs e)
      {
          this.grd1.PageIndex = e.NewPageIndex;
          this.BindGridView();
      }
      
      protected void ExporttoExcel()
      {
          Response.Clear();
          Response.AddHeader("content-disposition", "attachment; filename=Report.xls");
          Response.ContentType = "application/vnd.xls";
          System.IO.StringWriter stringWrite = new System.IO.StringWriter();
          System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
      
          // ************************
          this.grd1.AllowPaging = false; // <- disable paging then render
          this.BindGridView();
          // ************************
      
          this.grd1.RenderControl(htmlWrite);
          Response.Write(stringWrite.ToString());
          Response.End();
      }
      
      public override void VerifyRenderingInServerForm(Control control)
      {
          //base.VerifyRenderingInServerForm(control);
      }
      
      protected override void Render(HtmlTextWriter writer)
      {
          if (this._Export)
              this.ExporttoExcel();
          else
              base.Render(writer);
      }
      
      private bool _Export = false;
      
      protected void btnExport_Click(object sender, EventArgs e)
      {
          this._Export = true;
      }
      

      【讨论】:

      • 我试过了,它并没有导出所有数据。它只导出第一页数据。
      • 好的,那么您可能还需要在重置分页后再次进行绑定。
      • 现在gridview甚至没有导出。
      • @Vicky,我不确定你是如何导出的,我在这里添加了一个工作示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 2016-07-06
      • 2014-09-29
      • 2011-10-04
      相关资源
      最近更新 更多