通过单击提交按钮将gridview导出到Excel工作表

时间:2013-06-27 19:15:13

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

我正在创建一个c#应用程序。 在这个应用程序中,我从用户那里获取输入并使用这些条目我发出一个SQL查询并在Gridview中显示结果。 所以当我们点击提交按钮时会发生这些动作。 在此之后,我想给用户一个选项,通过单击另一个提交按钮将gridview结果导出到Excel工作表。 这些东西的代码是:

aspx代码:

     <body>
        <form id="form1" runat="server">
            <div>
                <b>Enter Value 1 :</b>
                <asp:TextBox ID="p1" runat="server" />
                <br />

                <b>Enter value 2 :</b>
                <asp:TextBox ID="p2" runat="server" /><br />

                <asp:Button ID="btn1" runat="server" OnClick="Button1_Click" Text="Start Search" />
                 <asp:Button ID="btn2" runat="server" OnClick="Button2_Click" Text="Export Data to Excel" />
                <hr />

                        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"
                            OnPageIndexChanging="gridView_PageIndexChanging"
                            ShowFooter="false"
                            CssClass="gridstyle"
                            EnableViewState="false"
                            AllowPaging="true">
                            <AlternatingRowStyle CssClass="altrowstyle" />
                            <HeaderStyle CssClass="headerstyle" />
                            <RowStyle CssClass="rowstyle" />
                            <RowStyle Wrap="false" />
                            <HeaderStyle Wrap="false" />
                        </asp:GridView>
            </div>
        </form>
    </body>

此代码的代码文件是:

    public partial class pSearch : System.Web.UI.Page
    {
    SqlConnection sqlconn = new  SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DBConnectionString"].ConnectionString);
    DataSet dsldata;
    protected void Page_Load(object sender, EventArgs e)
    {

    }


    protected void Button2_Click(object sender, EventArgs e)
    {
        DataSet ds0 = new DataSet();
        ds0 = (DataSet)Session["data"]; 
        DataView dataview_ldata = dsldata.Tables[0].DefaultView;
        DataTable dt = dsldata.Tables[0];
        GridView1.DataSource = dataview_ldata;
        GridView1.DataBind();
        ExportToExcel(GridView1);

    }



    private void ExportToExcel(GridView GrdView)
    {
        try
        {
            Response.Clear();
            Response.AddHeader("content-disposition", "attachment; filename=FileName.xls");
            Response.Charset = "";
            // If you want the option to open the Excel file without saving than
            // comment out the line below
            // Response.Cache.SetCacheability(HttpCacheability.NoCache);
            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();
        }
        catch (Exception ex)
        {
            Response.Write("<script>alert('" + ex.Message + "')</script>");
        }
    }



    protected void Button1_Click(object sender, EventArgs e)
        {

        string RName = Page.Request.QueryString["RName"];
        string typeofquery = "mycommand";
        string pv1 = p1.Text ;
        string pv2 = p2.Text ;
        string abc = null;
        abc = "" + typeofquery + " @RName=" + RName + ",@P1='" + pv1 + "',@P2='" + pv2 + "'";
        SqlDataAdapter cmdldata = new SqlDataAdapter(abc, sqlconn);

        GridView1.PageSize = 1000;


        cmdldata.SelectCommand.CommandTimeout = 600;
         dsldata = new DataSet();
        ErrorHandling errhandle = new ErrorHandling();
        try
        {
            cmdldata.Fill(dsldata);
            Session["data"] = dsldata;

            DataView dataview_ldata = dsldata.Tables[0].DefaultView;
            DataTable dt = dsldata.Tables[0];
            GridView1.DataSource = dataview_ldata;
            GridView1.DataBind();

        }//end of try
        catch (Exception ex)
        {
            String errorMessage = errhandle.displayException(ex);
            Response.Write(errorMessage);

        }//end of catch
        finally
        {
            if (errhandle != null)
            {
                errhandle = null;
            }
        }//end of finally
    }

      public override void VerifyRenderingInServerForm(Control control)
    {

        // Confirms that an HtmlForm control is rendered for the specified ASP.NET server control at run time.

    }

    protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView1.PageIndex = e.NewPageIndex;
        GridView1.DataBind();
    }

    }

我现在得到一张空的excel表作为我的输出。

从我的分析中我认为以下是问题所在: 单击按钮1时查询生成Gridview。单击按钮2时,之前的所有数据都将丢失(即使我们仍然可以在屏幕上看到它)。这就是为什么我得到一个空的Excel工作表现在。

其次,由于我是在按钮点击而不是在页面加载上创建gridview,因此gridview中的数据不可用。      protected void Button2_Click(object sender,EventArgs e){} 功能

现在只有让它工作的选项是我应该在button2_Click函数上再次执行查询的相同操作。

但我再也不认为这是一种有效的方法。而且我运行一个复杂的查询,有时需要3-4分钟来提供输出。因此运行查询两次是不可能的。我也试过缓存数据集,但它没有用。即使在不工作的情况下创建会话。

自从过去1天以来,我一直在打破这个问题。请帮我!谢谢。

1 个答案:

答案 0 :(得分:1)

缓存听起来像是一个很好的解决方案,您可以发布缓存代码吗?

否则,我会在ViewState中执行此操作。获取长查询的结果,将其存储在ViewState中,将结果绑定到GridView,然后在单击按钮后,可以访问ViewState存储的数据。这不是对大型数据集执行此操作的最佳方法,因为ViewState通过每个PostBack的线路发送并存储在客户端。它可以真正减慢您的应用程序速度并导致意外错误。

这是我的编辑,我在当地工作:

将它存储在Session中应该可以正常工作。这是我对一些虚拟数据所做的。仅供参考,您可以将GridView直接绑定到DataSet,而不必向下钻取到DataTable或类似的东西。

        protected void Button1_Click(object sender, EventArgs e)
        {

            string RName = Page.Request.QueryString["RName"];
            string typeofquery = "mycommand";
            string pv1 = p1.Text;
            string pv2 = p2.Text;
            string abc = null;
            abc = "" + typeofquery + " @RName=" + RName + ",@P1='" + pv1 + "',@P2='" + pv2 + "'";
            SqlDataAdapter cmdldata = new SqlDataAdapter(abc, sqlconn);

            GridView1.PageSize = 1000;


            cmdldata.SelectCommand.CommandTimeout = 600;

            var dummyDt = new DataTable();
            dummyDt.Columns.Add("Sup");
            dummyDt.Columns.Add("Bro");

            dummyDt.Rows.Add("Test1", "test2");
            dummyDt.Rows.Add("Test1", "test2");
            dummyDt.Rows.Add("Test1", "test2");
            dummyDt.Rows.Add("Test1", "test2");
            dummyDt.Rows.Add("Test1", "test2");

            dsldata = new DataSet();
            dsldata.Tables.Add(dummyDt);
            //ErrorHandling errhandle = new ErrorHandling();
            try
            {
                //cmdldata.Fill(dsldata);
                Session["data"] = dsldata;

                //DataView dataview_ldata = dsldata.Tables[0].DefaultView;
                //DataTable dt = dsldata.Tables[0];
                GridView1.DataSource = dsldata;
                GridView1.DataBind();

            }//end of try
            catch (Exception ex)
            {
                //String errorMessage = errhandle.displayException(ex);
                Response.Write(ex.Message);

            }//end of catch
            finally
            {
                //if (errhandle != null)
                //{
                //    errhandle = null;
                //}
            }//end of finally
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            //DataSet ds0 = new DataSet();
            //ds0 = ;
            //DataView dataview_ldata = dsldata.Tables[0].DefaultView;
            //DataTable dt = dsldata.Tables[0];
            GridView1.DataSource = (DataSet)Session["data"];
            GridView1.DataBind();
            ExportToExcel(GridView1);

        }

        private void ExportToExcel(GridView GrdView)
        {
            try
            {
                Response.Clear();
                Response.AddHeader("content-disposition", "attachment; filename=FileName.xls");
                Response.Charset = "";
                // If you want the option to open the Excel file without saving than
                // comment out the line below
                // Response.Cache.SetCacheability(HttpCacheability.NoCache);
                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();
            }
            catch (Exception ex)
            {
                Response.Write("<script>alert('" + ex.Message + "')</script>");
            }
        }