I have already explained how to Export GridView to Excel in my following articles

Export GridView To Word/Excel/PDF/CSV in ASP.Net
Export GridView with Images from database to Word, Excel and PDF Formats
Export GridView with Images to Word, Excel and PDF Formats in ASP.Net

But this is something different and is hitting the forums quite frequently.

1. How to Export Multiple GridViews to Excel?

2. How to align GridViews in Excel?

 

And the article below is the working answer for the above questions.

 

GridViews

Below is the HTML markup of the two GridViews

<asp:GridView ID="GridView1" runat="server"

    AutoGenerateColumns = "false" Font-Names = "Arial"

    Font-Size = "11pt" AlternatingRowStyle-BackColor = "#C2D69B" 

    HeaderStyle-BackColor = "green" AllowPaging ="true"  

    OnPageIndexChanging = "OnPaging">

   <Columns>

    <asp:BoundField ItemStyle-Width = "150px" DataField = "CustomerID"

       HeaderText = "CustomerID" />

    <asp:BoundField ItemStyle-Width = "150px" DataField = "City"

       HeaderText = "City"/>

   </Columns>

</asp:GridView>

<br /><br />

<asp:GridView ID="GridView2" runat="server"

    AutoGenerateColumns = "false" Font-Names = "Arial"

    Font-Size = "11pt" AlternatingRowStyle-BackColor = "#C2D69B" 

    HeaderStyle-BackColor = "green" AllowPaging ="true"  

    OnPageIndexChanging = "OnPaging" >

   <Columns>

    <asp:BoundField ItemStyle-Width = "150px" DataField = "OrderID"

       HeaderText = "Order ID" />

    <asp:BoundField ItemStyle-Width = "150px" DataField = "CustomerID"

      HeaderText = "Customer ID"/>

   </Columns>

</asp:GridView>

 

   

    

Namespaces

You will need to import the following namespaces

C#

using System.IO;

using System.Text;

using System.Configuration;

 

 

VB.Net

Imports System.IO

Imports System.Text

Imports System.Configuration

 

Connection String

Below is the connection string used for this tutorial. As you will notice I am using the NorthWind SQL Server Data base which you can download by clicking here

 

<connectionStrings>

  <add name="conString" connectionString="Data Source=.\SQLEXPRESS;

               database=Northwind;Integrated Security=true" />

</connectionStrings>

           

 

DataBinding GridViews

 

Below is the how I bind the two GridViews in the Page Load Event of the ASP.Net Web Page. You will notice I am running a simple Select Query and binding the data to both the GridViews using the GetData function

C#

 

 

protected void Page_Load(object sender, EventArgs e)

{

    string strQuery = "select CustomerID,City,Country from customers";

    SqlCommand cmd = new SqlCommand(strQuery);

    DataTable dt = GetData(cmd);

    GridView1.DataSource = dt;

    GridView1.DataBind();

 

    strQuery = "select OrderID, CustomerID, EmployeeID from  Orders";

    cmd = new SqlCommand(strQuery);

    dt = GetData(cmd);

    GridView2.DataSource = dt;

    GridView2.DataBind();

}

 

private DataTable GetData(SqlCommand cmd)

{

    DataTable dt = new DataTable();

    String strConnString = ConfigurationManager

        .ConnectionStrings["conString"].ConnectionString;

    SqlConnection con = new SqlConnection(strConnString);

    SqlDataAdapter sda = new SqlDataAdapter();

    cmd.CommandType = CommandType.Text;

    cmd.Connection = con;

    try

    {

        con.Open();

        sda.SelectCommand = cmd;

        sda.Fill(dt);

        return dt;

    }

    catch (Exception ex)

    {

        throw ex;

    }

    finally

    {

        con.Close();

        sda.Dispose();

        con.Dispose();

    }

}

 

   

  

VB.Net

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

   Dim strQuery As String = "select CustomerID,City,Country from customers"

   Dim cmd As New SqlCommand(strQuery)

   Dim dt As DataTable = GetData(cmd)

   GridView1.DataSource = dt

   GridView1.DataBind()

 

   strQuery = "select OrderID, CustomerID, EmployeeID from Orders"

   cmd = New SqlCommand(strQuery)

   dt = GetData(cmd)

   GridView2.DataSource = dt

   GridView2.DataBind()

End Sub

 

Private Function GetData(ByVal cmd As SqlCommand) As DataTable

   Dim dt As New DataTable()

   Dim strConnString As String = ConfigurationManager _

             .ConnectionStrings("conString").ConnectionString()

   Dim con As New SqlConnection(strConnString)

   Dim sda As New SqlDataAdapter()

   cmd.CommandType = CommandType.Text

   cmd.Connection = con

   Try

     con.Open()

     sda.SelectCommand = cmd

     sda.Fill(dt)

     Return dt

   Catch ex As Exception

     Throw ex

   Finally

     con.Close()

     sda.Dispose()

     con.Dispose()

   End Try

End Function

 

The figure below displays the two GridViews we just populated using the NorthWind Database.


Multiple GridViews displayed on ASP.Net Webpage



Concept

Now in order to export multiple GridViews you will need to wrap the GridViews in a Control that will act as a container and then export that control instead of the GridViews. Hence here I am creating a fake dynamic table and exporting the table instead of GridViews.

   

 

Option of Paging Enable Disable and GridView Alignment

 

Here I provided the user facility whether user wants complete records or only the records for the current page. Secondly I also provided the choice whether the two GridViews should be aligned horizontally next to each other or vertically one after another using the two RadioButtonLists

<br />Paging Enabled?

<asp:RadioButtonList ID="rbPaging" runat="server">

<asp:ListItem  Text = "Yes" Value = "True" Selected = "True">

</asp:ListItem>

<asp:ListItem  Text = "No" Value = "False"></asp:ListItem>

</asp:RadioButtonList>

<br />

Export Preference

<asp:RadioButtonList ID="rbPreference" runat="server">

      <asp:ListItem  Text = "Vertical" Value = "1" Selected = "True">

</asp:ListItem>

      <asp:ListItem  Text = "Horizontal" Value = "2"></asp:ListItem>

</asp:RadioButtonList>

 

In the front end they look like below. As you can see user can choose how he wants the output in the Exported Excel file.


Option to Enable Disable Paging and also the Orientation while exporting



Exporting the Multiple GridViews

Now comes the final part that is exporting the two GridViews to Excel on the click of the Export Button

Refer the code below

   

         

C#

protected void btnExportExcel_Click(object sender, EventArgs e)

{

    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);

 

    PrepareForExport(GridView1);

    PrepareForExport(GridView2);

 

    Table tb = new Table();

    TableRow tr1 = new TableRow();

    TableCell cell1 = new TableCell();

    cell1.Controls.Add(GridView1);

    tr1.Cells.Add(cell1);

    TableCell cell3 = new TableCell();

    cell3.Controls.Add(GridView2);

    TableCell cell2 = new TableCell();

    cell2.Text = "&nbsp;";

    if (rbPreference.SelectedValue == "2")

    {

        tr1.Cells.Add(cell2);

        tr1.Cells.Add(cell3);

        tb.Rows.Add(tr1);

    }

    else

    {

        TableRow tr2 = new TableRow();

        tr2.Cells.Add(cell2);  

        TableRow tr3 = new TableRow();

        tr3.Cells.Add(cell3);

        tb.Rows.Add(tr1);

        tb.Rows.Add(tr2);

        tb.Rows.Add(tr3);

    }

    tb.RenderControl(hw);

 

    //style to format numbers to string

    string style = @"<style> .textmode { mso-number-format:\@; } </style>";

    Response.Write(style);

    Response.Output.Write(sw.ToString());

    Response.Flush();

    Response.End();

}

 

        

 

VB.Net

Protected Sub btnExportExcel_Click(ByVal sender As Object, ByVal e As EventArgs)

   Response.Clear()

   Response.Buffer = True

 

   Response.AddHeader("content-disposition", _

          "attachment;filename=GridViewExport.xls")

   Response.Charset = ""

   Response.ContentType = "application/vnd.ms-excel"

   Dim sw As New StringWriter()

   Dim hw As New HtmlTextWriter(sw)

 

   PrepareForExport(GridView1)

   PrepareForExport(GridView2)

 

   Dim tb As New Table()

   Dim tr1 As New TableRow()

   Dim cell1 As New TableCell()

   cell1.Controls.Add(GridView1)

   tr1.Cells.Add(cell1)

   Dim cell3 As New TableCell()

   cell3.Controls.Add(GridView2)

   Dim cell2 As New TableCell()

   cell2.Text = "&nbsp;"

   If rbPreference.SelectedValue = "2" Then

      tr1.Cells.Add(cell2)

      tr1.Cells.Add(cell3)

      tb.Rows.Add(tr1)

   Else

      Dim tr2 As New TableRow()

      tr2.Cells.Add(cell2)

      Dim tr3 As New TableRow()

      tr3.Cells.Add(cell3)

      tb.Rows.Add(tr1)

      tb.Rows.Add(tr2)

      tb.Rows.Add(tr3)

   End If

   tb.RenderControl(hw)

 

  'style to format numbers to string

   Dim style As String = "<style> .textmode { mso-number-format:\@; } </style>"

   Response.Write(style)

   Response.Output.Write(sw.ToString())

   Response.Flush()

   Response.End()

End Sub

 

As you will notice I am creating a Dynamic Table and adding the GridViews to the Dynamic Table Cells and then rendering the Table instead of the GridViews this is is the trick that makes it possible to export two or multiple GridViews to a Single Excel Sheet

You will notice the PrepareForExport Function which basically gives some formatting and styling to the GridView refer below.

   

C#

protected void PrepareForExport(GridView Gridview)

{

    Gridview.AllowPaging = Convert.ToBoolean(rbPaging.SelectedItem.Value);   

    Gridview.DataBind();

 

    //Change the Header Row back to white color

    Gridview.HeaderRow.Style.Add("background-color", "#FFFFFF");

 

    //Apply style to Individual Cells

    for (int k = 0; k < Gridview.HeaderRow.Cells.Count; k++)

    {

        Gridview.HeaderRow.Cells[k].Style.Add("background-color", "green");

    }

 

    for (int i = 0; i < Gridview.Rows.Count; i++)

    {

        GridViewRow row = Gridview.Rows[i];

 

        //Change Color back to white

        row.BackColor = System.Drawing.Color.White;

 

        //Apply text style to each Row

        row.Attributes.Add("class", "textmode");

 

        //Apply style to Individual Cells of Alternating Row

        if (i % 2 != 0)

        {

            for (int j = 0; j < Gridview.Rows[i].Cells.Count; j++)

            {

                row.Cells[j].Style.Add("background-color", "#C2D69B");

            }

        }

    }

}

 

          

 

VB.Net

 

Protected Sub PrepareForExport(ByVal Gridview As GridView)

   Gridview.AllowPaging = Convert.ToBoolean(rbPaging.SelectedItem.Value)

   Gridview.DataBind()

 

   'Change the Header Row back to white color

   Gridview.HeaderRow.Style.Add("background-color", "#FFFFFF")

 

   'Apply style to Individual Cells

   For k As Integer = 0 To Gridview.HeaderRow.Cells.Count - 1

       Gridview.HeaderRow.Cells(k).Style.Add("background-color", "green")

   Next

 

   For i As Integer = 0 To Gridview.Rows.Count - 1

       Dim row As GridViewRow = Gridview.Rows(i)

 

       'Change Color back to white

       row.BackColor = System.Drawing.Color.White

 

       'Apply text style to each Row

       row.Attributes.Add("class", "textmode")

 

       'Apply style to Individual Cells of Alternating Row

       If i Mod 2 <> 0 Then

          For j As Integer = 0 To Gridview.Rows(i).Cells.Count - 1

            row.Cells(j).Style.Add("background-color", "#C2D69B")

          Next

      End If

   Next

End Sub

 

The Screenshots below display the GridViews in the Horizontal and the Vertical Alignments

 

Vertical Alignment


Multiple GridViews aligned Vertically in the exported Excel File


Horizontal Alignment


Multiple GridViews aligned Horizontally in the exported Excel File


You might get the following errors. Click on the links below for the solution to resolve them

RegisterForEventValidation can only be called during Render()

Control 'GridView1' of type 'GridView' must be placed inside a form tag with runat=server


To View the Live demo Click here

 

You can download the complete source code in VB.Net and C# using the link below.

ExportMultipleGridViewsToExcel.zip (6.07 kb)