Cloud
Cloud

Reputation: 213

Exporting 3 gridviews to excel into 3 different worksheets

From my website, I have a button which calls a method and then generates reports to excel. the code works. The problem is that the code displays all gridviews (there are 3) on the same tab. What code may I add to this so that when i click on the button, it will download the document but have each gridview displayed on their separate tabs. The tab names will be top 1, top 2, and top 3. So to clarify, right now all of the gridviews are displayed on the top 1 tab, I need to make 2 more tabs (top 2 and top 3) and put gridview2 on top 2 tab, and gridview3 on the top 3 tab.

using System;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Text;
using System.IO;



public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
    DataSet dataSet = new DataSet();

    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ISALog1ConnectionString"].ToString());

    SqlCommand cmd = new SqlCommand("exec ProxyReport", conn);
    cmd.CommandTimeout = 200;

    SqlDataAdapter ad = new SqlDataAdapter(cmd);
    ad.Fill(dataSet);

    GridView1.DataSource = dataSet.Tables[0];
    GridView1.DataBind();
    GridView2.DataSource = dataSet.Tables[1];
    GridView2.DataBind();
    GridView3.DataSource = dataSet.Tables[2];
    GridView3.DataBind();

}
protected void Button1_Click(object sender, EventArgs e)
{
    string attachment = "attachment; filename=Top 1.xls";
    Response.ClearContent();
    Response.AddHeader("content-disposition", attachment);
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = "application/ms-excel";
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    GridView1.RenderControl(htw);
    GridView2.RenderControl(htw);
    GridView3.RenderControl(htw);
    Response.Write(sw.ToString());
    Response.End();
}
public override void VerifyRenderingInServerForm(Control control)
{

}


}

Upvotes: 3

Views: 5935

Answers (1)

Edward Pescetto
Edward Pescetto

Reputation: 926

Yes, you need to add EPPlus from codeplex: http://epplus.codeplex.com/ and then add this to your code. You can use it to add as many worksheets as you want:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.Data.SqlClient;
    using System.IO;
    using OfficeOpenXml;
    using System.Configuration;

    public partial class _Default : System.Web.UI.Page
    {
protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click(object sender, EventArgs e)
{
    GetExcel ge = new GetExcel();
    ge.ProcessRequest(HttpContext.Current);
}

public class GetExcel : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        DataSet dataSet = new DataSet();

        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ISALog1ConnectionString"].ToString());
        SqlCommand cmd = new SqlCommand("exec ProxyReport", conn);
        cmd.CommandTimeout = 200;
        SqlDataAdapter ad = new SqlDataAdapter(cmd);
        ad.Fill(dataSet);

       GridView1.DataSource = dataSet.Tables[0];
       GridView1.DataBind();
       GridView2.DataSource = dataSet.Tables[1];
       GridView2.DataBind();
       GridView3.DataSource = dataSet.Tables[2];
       GridView3.DataBind();   

        dataSet.Tables[0].TableName = "1";
        dataSet.Tables[1].TableName = "2";
        dataSet.Tables[2].TableName = "3";

        int count = 3;   

            MemoryStream ms = GetExcel.DataTableToExcelXlsx(dataSet, count);
            ms.WriteTo(context.Response.OutputStream);
            context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            context.Response.AddHeader("Content-Disposition", "attachment;filename=EPPlusData.xlsx");
            context.Response.StatusCode = 200;
            context.Response.End();

    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    public static MemoryStream DataTableToExcelXlsx(DataSet ds, int count)
    {
        MemoryStream Result = new MemoryStream();
        ExcelPackage pack = new ExcelPackage();

        for (int i = 1; i <= count; i++)
        {
            DataTable table = ds.Tables[i.ToString()];
            ExcelWorksheet ws = pack.Workbook.Worksheets.Add("MySheet" + i.ToString());

            int col = 1;
            int row = 1;

            foreach (DataColumn cl in table.Columns)
            {
                ws.Cells[row, col].Value = cl.ColumnName;
                col++;
            }
            col = 1;
            foreach (DataRow rw in table.Rows)
            {
                foreach (DataColumn cl in table.Columns)
                {
                    if (rw[cl.ColumnName] != DBNull.Value)
                        ws.Cells[row + 1, col].Value = rw[cl.ColumnName].ToString();
                    col++;
                }
                row++;
                col = 1;
            }
        }
        pack.SaveAs(Result);
        return Result;
    }
}}

Upvotes: 3

Related Questions