This article will illustrate, how to export all Pages of
GridView with Paging
Enabled to
Word,
Excel,
PDF and
CSV file along with formatting i.e. Styles and Colors in
ASP.Net.
Download iTextSharp and XmlWorkerHelper Libraries
You can download the iTextSharp and XmlWorkerHelper libraries from the following links.
Note: You will need to add the reference of iTextSharp and XmlWorkerHelper libraries in your project.
Database
For this article I am making use of the Microsoft’s Northwind Database. You can download it from here.
HTML Markup
The
HTML Markup consists of:
GridView – For displaying data.
Columns
GridView consists of three BoundField columns.
Properties
AllowPaging – For enabling paging in the
GridView control. Here it is set to
true.
Events
The
GridView has been assigned with
OnPageIndexChanging event handler.
The Buttons have been assigned with OnClick event handlers.
<asp:GridView ID="gvCustomers" HeaderStyle-BackColor="#3AC0F2" HeaderStyle-ForeColor="White"
Font-Names="Arial" Font-Size="10" RowStyle-BackColor="#A1DCF2" AlternatingRowStyle-BackColor="White"
AlternatingRowStyle-ForeColor="#000" runat="server" AutoGenerateColumns="false"
AllowPaging="true" OnPageIndexChanging="OnPageIndexChanging">
<Columns>
<asp:BoundField DataField="ContactName" HeaderText="Contact Name" ItemStyle-Width="150px" />
<asp:BoundField DataField="City" HeaderText="City" ItemStyle-Width="100px" />
<asp:BoundField DataField="Country" HeaderText="Country" ItemStyle-Width="100px" />
</Columns>
</asp:GridView>
<br />
<asp:Button ID="btnWord" runat="server" Text="Export To Word" OnClick="ExportToWord" Width="130" />
<asp:Button ID="btnExcel" runat="server" Text="Export To Excel" OnClick="ExportToExcel" Width="130" />
<br />
<br />
<asp:Button ID="btnPDF" runat="server" Text="Export To PDF" OnClick="ExportToPDF" Width="130" />
<asp:Button ID="btnCSV" runat="server" Text="Export To CSV" OnClick="ExportToCSV" Width="130" />
Namespaces
You will need to import the following namespaces.
C#
using System.IO;
using System.Text;
using System.Data;
using System.Drawing;
using System.Data.SqlClient;
using System.Configuration;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
VB.Net
Imports System.IO
Imports System.Data
Imports System.Drawing
Imports System.Data.SqlClient
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.tool.xml
Binding the GridView
Inside the
Page Load event handler, the
GridView is populated with records fetched from the
Customers Table of the
Northwind Database.
C#
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.BindGrid();
}
}
private void BindGrid()
{
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Customers"))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
gvCustomers.DataSource = dt;
gvCustomers.DataBind();
}
}
}
}
}
VB.Net
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
If Not IsPostBack Then
Me.BindGrid()
End If
End Sub
Private Sub BindGrid()
Dim constr As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString
Using con As New SqlConnection(constr)
Using cmd As New SqlCommand("SELECT * FROM Customers")
Using sda As New SqlDataAdapter()
cmd.Connection = con
sda.SelectCommand = cmd
Using dt As New DataTable()
sda.Fill(dt)
gvCustomers.DataSource = dt
gvCustomers.DataBind()
End Using
End Using
End Using
End Using
End Sub
Implement Paging in GridView
Inside the
OnPageIndexChanging event handler, the
PageIndex property of the
GridView is updated with the new Page Number which was clicked.
Finally, the
GridView is populated using the
BindGrid method which in-turn displays the new
GridView page.
C#
protected void OnPageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvCustomers.PageIndex = e.NewPageIndex;
this.BindGrid();
}
VB.Net
Protected Sub OnPageIndexChanging(sender As Object, e As GridViewPageEventArgs)
gvCustomers.PageIndex = e.NewPageIndex
Me.BindGrid()
End Sub
Exporting GridView to Word document with Formatting
When the Export Button is clicked, the Response class properties are set.
1. Content-Disposition – It is a response header indicating, the download file is an attachment and allows setting the file name.
2. ContentType – It informs the Browser about the file type. In this case it is Word document.
Next, the
StringWriter and
HtmlTextWriter class objects are created and the
Paging is disabled for the
GridView by setting the
AllowPaging property to
false and the
GridView is again populated with records fetched from the database by making call to the
BindGrid method.
Then, a FOR EACH loop is executed over the
GridView rows and the style and formatting are applied to the Header Row and Alternating Row of the
GridView control.
Note: The colors are applied to individual cell of each Row and not to the whole Row as if this is not done then the color will spread on all cells of the Excel sheet.
Finally, StringWriter object is written to the Response which initiates the File download operation.
C#
protected void ExportToWord(object sender, EventArgs e)
{
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.doc");
Response.Charset = "";
Response.ContentType = "application/vnd.ms-word";
using (StringWriter sw = new StringWriter())
{
HtmlTextWriter hw = new HtmlTextWriter(sw);
//To Export all pages.
gvCustomers.AllowPaging = false;
this.BindGrid();
gvCustomers.HeaderRow.BackColor = Color.White;
foreach (TableCell cell in gvCustomers.HeaderRow.Cells)
{
cell.BackColor = gvCustomers.HeaderStyle.BackColor;
}
foreach (GridViewRow row in gvCustomers.Rows)
{
row.BackColor = Color.White;
foreach (TableCell cell in row.Cells)
{
if (row.RowIndex % 2 == 0)
{
cell.BackColor = gvCustomers.AlternatingRowStyle.BackColor;
}
else
{
cell.BackColor = gvCustomers.RowStyle.BackColor;
}
}
}
gvCustomers.RenderControl(hw);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
}
}
VB.Net
Protected Sub ExportToWord(ByVal sender As Object, ByVal e As EventArgs)
Response.Clear()
Response.Buffer = True
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.doc")
Response.Charset = ""
Response.ContentType = "application/vnd.ms-word"
Using sw As StringWriter = New StringWriter()
Dim hw As HtmlTextWriter = New HtmlTextWriter(sw)
'To Export all pages.
gvCustomers.AllowPaging = False
Me.BindGrid()
gvCustomers.HeaderRow.BackColor = Color.White
For Each cell As TableCell In gvCustomers.HeaderRow.Cells
cell.BackColor = gvCustomers.HeaderStyle.BackColor
Next
For Each row As GridViewRow In gvCustomers.Rows
row.BackColor = Color.White
For Each cell As TableCell In row.Cells
If row.RowIndex Mod 2 = 0 Then
cell.BackColor = gvCustomers.AlternatingRowStyle.BackColor
Else
cell.BackColor = gvCustomers.RowStyle.BackColor
End If
Next
Next
gvCustomers.RenderControl(hw)
Response.Output.Write(sw.ToString())
Response.Flush()
Response.End()
End Using
End Sub
Exporting GridView to Excel with Formatting
When the Export Button is clicked, the Response class properties are set.
1. Content-Disposition – It is a response header indicating, the download file is an attachment and allows setting the file name.
2.
ContentType – It informs the Browser about the file type. In this case it is
Excel file.
Next, the
StringWriter and
HtmlTextWriter class objects are created and the
Paging is disabled for the
GridView by setting the
AllowPaging property to
false and the
GridView is again populated with records fetched from the database by making call to the
BindGrid method.
Then, a FOR EACH loop is executed over the
GridView rows and the style and formatting are applied to the Header Row and Alternating Row of the
GridView control.
Note: The colors are applied to individual cell of each Row and not to the whole Row as if this is not done then the color will spread on all cells of the Excel sheet.
After that, CSS class named
textmode is applied to each cell of the
GridView. This class makes sure that all the contents are rendered in Text format (
mso number format).
Note: The mso number format style prevents large numbers from getting converted to exponential values.
Finally, StringWriter object is written to the Response which initiates the File download operation.
C#
protected void ExportToExcel(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";
using (StringWriter sw = new StringWriter())
{
HtmlTextWriter hw = new HtmlTextWriter(sw);
//To Export all pages.
gvCustomers.AllowPaging = false;
this.BindGrid();
gvCustomers.HeaderRow.BackColor = Color.White;
foreach (TableCell cell in gvCustomers.HeaderRow.Cells)
{
cell.BackColor = gvCustomers.HeaderStyle.BackColor;
}
foreach (GridViewRow row in gvCustomers.Rows)
{
row.BackColor = Color.White;
foreach (TableCell cell in row.Cells)
{
if (row.RowIndex % 2 == 0)
{
cell.BackColor = gvCustomers.AlternatingRowStyle.BackColor;
}
else
{
cell.BackColor = gvCustomers.RowStyle.BackColor;
}
cell.CssClass = "textmode";
}
}
gvCustomers.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 ExportToExcel(sender As Object, e As EventArgs)
Response.Clear()
Response.Buffer = True
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.xls")
Response.Charset = ""
Response.ContentType = "application/vnd.ms-excel"
Using sw As New StringWriter()
Dim hw As New HtmlTextWriter(sw)
'To Export all pages.
gvCustomers.AllowPaging = False
Me.BindGrid()
gvCustomers.HeaderRow.BackColor = Color.White
For Each cell As TableCell In gvCustomers.HeaderRow.Cells
cell.BackColor = gvCustomers.HeaderStyle.BackColor
Next
For Each row As GridViewRow In gvCustomers.Rows
row.BackColor = Color.White
For Each cell As TableCell In row.Cells
If row.RowIndex Mod 2 = 0 Then
cell.BackColor = gvCustomers.AlternatingRowStyle.BackColor
Else
cell.BackColor = gvCustomers.RowStyle.BackColor
End If
cell.CssClass = "textmode"
Next
Next
gvCustomers.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 Using
End Sub
Exporting GridView to PDF with Formatting
When the Export Button is clicked, the Response class properties are set.
1. Content-Disposition – It is a response header indicating, the download file is an attachment and allows setting the file name.
2.
ContentType – It informs the Browser about the file type. In this case it is
PDF.
The
Paging is disabled for the
GridView by setting the
AllowPaging property to
false and the
GridView is again populated with records fetched from the database by making call to the
BindGrid method.
Next, the
GridView is rendered into an
HTML string using
HtmlTextWriter and then, the generated
HTML is added to the
iTextSharp PDF document using
Document class.
After that, the
PDF document is opened and the
GridView data is written using
ParseXHtml method of
XmlWorkerHelper class.
Finally, StringWriter object is written to the Response which initiates the File download operation.
C#
protected void ExportToPDF(object sender, EventArgs e)
{
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf");
Response.Charset = "";
Response.ContentType = "application/pdf";
//To Export all pages.
gvCustomers.AllowPaging = false;
this.BindGrid();
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter hw = new HtmlTextWriter(sw))
{
gvCustomers.RenderControl(hw);
using (StringReader sr = new StringReader(sw.ToString()))
{
using (Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f))
{
using (PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream))
{
pdfDoc.Open();
XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
pdfDoc.Close();
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Write(pdfDoc);
Response.End();
}
}
}
}
}
}
VB.Net
Protected Sub ExportToPDF(ByVal sender As Object, ByVal e As EventArgs)
Response.Clear()
Response.Buffer = True
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf")
Response.Charset = ""
Response.ContentType = "application/pdf"
'To Export all pages.
gvCustomers.AllowPaging = False
Me.BindGrid()
Using sw As StringWriter = New StringWriter()
Using hw As HtmlTextWriter = New HtmlTextWriter(sw)
gvCustomers.RenderControl(hw)
Using sr As StringReader = New StringReader(sw.ToString())
Using pdfDoc As Document = New Document(PageSize.A4, 10.0F, 10.0F, 10.0F, 0.0F)
Using writer As PdfWriter = PdfWriter.GetInstance(pdfDoc, Response.OutputStream)
pdfDoc.Open()
XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr)
pdfDoc.Close()
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Response.Write(pdfDoc)
Response.End()
End Using
End Using
End Using
End Using
End Using
End Sub
Exporting GridView to CSV file
When the Export Button is clicked, the Response class properties are set.
1. Content-Disposition – It is a response header indicating, the download file is an attachment and allows setting the file name.
2.
ContentType – It informs the Browser about the file type. In this case it is
CSV file.
The
Paging is disabled for the
GridView by setting the
AllowPaging property to
false and the
GridView is again populated with records fetched from the database by making call to the
BindGrid method.
Next, the
StringBuilder class object is created and a FOR EACH loop is executed over the Header row cells of the
GridView and value of each cell added to the
StringBuilder object with comma separated (delimited) string.
Then, a FOR EACH loop is executed over the
GridView Rows and Columns and a comma separated (delimited) string is generated.
Finally, StringBuilder object is written to the Response which initiates the File download operation.
C#
protected void ExportToCSV(object sender, EventArgs e)
{
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.csv");
Response.Charset = "";
Response.ContentType = "text/csv";
//To Export all pages.
gvCustomers.AllowPaging = false;
this.BindGrid();
StringBuilder sb = new StringBuilder();
foreach (TableCell cell in gvCustomers.HeaderRow.Cells)
{
//Append data with separator.
sb.Append(cell.Text + ',');
}
//Append new line character.
sb.Append("\r\n");
foreach (GridViewRow row in gvCustomers.Rows)
{
foreach (TableCell cell in row.Cells)
{
//Append data with separator.
sb.Append(cell.Text + ',');
}
//Append new line character.
sb.Append("\r\n");
}
Response.Output.Write(sb.ToString());
Response.Flush();
Response.End();
}
VB.Net
Protected Sub ExportToCSV(ByVal sender As Object, ByVal e As EventArgs)
Response.Clear()
Response.Buffer = True
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.csv")
Response.Charset = ""
Response.ContentType = "text/csv"
gvCustomers.AllowPaging = False
Me.BindGrid()
Dim sb As StringBuilder = New StringBuilder()
For Each cell As TableCell In gvCustomers.HeaderRow.Cells
'Append data with separator.
sb.Append(cell.Text & ",")
Next
'Append new line character.
sb.Append(vbCr & vbLf)
For Each row As GridViewRow In gvCustomers.Rows
For Each cell As TableCell In row.Cells
'Append data with separator.
sb.Append(cell.Text & ",")
Next
'Append new line character.
sb.Append(vbCr & vbLf)
Next
Response.Output.Write(sb.ToString())
Response.Flush()
Response.End()
End Sub
Error
The following error occurs when you tries to render a control such as
GridView to
HTML using the
RenderControl method.
Server Error in '/ASP.Net' Application.
ControlgvCustomersof type 'GridView' must be placed inside a form tag with runat=server.
Description:An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details:System.Web.HttpException: Control ' gvCustomers' of type 'GridView' must be placed inside a form tag with runat=server.
Solution
The solution to this problem is to override VerifyRenderingInServerForm event handler.
Screenshots
GridView with Paging enabled
Exported Word Document
Exported Excel file
Exported PDF file
Exported CSV (Text) file
Demo
Downloads