Home Asp.net Export GridView Data to Word Excel Text Pdf in Asp.net

Export GridView Data to Word Excel Text Pdf in Asp.net

40
4
Export gridview data to word, excel, text, pdf in asp.net
Export gridview data to word, excel, text, pdf in asp.net

In my previous tutorials, I’d explained how to export gridview data to word excel text pdf in .net, get gridview selected row hiddenfield values, print gridview data on print button click, and other more cracking tutorials on GridView, Asp.net, JavaScript, jQuery here.

Now here in this tutorial, I’ll explain how to export gridview selected row data with gridview’s exact CSS style and format to word, excel, pdf (using itextsharp.dll) and text file in asp.net using c# as well as vb.net with example code. Also explained how to send selected gridview row data in the email body.

To explain further about how to export gridview selected row data in asp.net, we need to create database table to read data and bind retrieved resultset to gridview, so simply execute following script to SQL query editor to create database table and then add few records manually or download complete example code with script at the end of the page.

Here is the script to create “SubjectDetails” table:

CREATE TABLE [dbo].[SubjectDetails]
(
    [SubjectId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [SubjectName] [nvarchar](100) NULL,
    [Marks] [int] NULL,
    [Grade] [nvarchar](50) NULL
)

I guess you all know about how to bind gridview. So I’m skipping that point and come to the subject to export gridview data to word, excel, csv, pdf and text file. Following is the HTML Markup that contains asp.net buttons and gridview, simply copy and paste to your .aspx page:

Export GridView Selected Row Data In Asp.net – [.aspx]

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Export gridview selected row data to Word, Excel, CSV, Pdf File Examples</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <table>
                <tr>
                    <td colspan="3">
                        <h4>Export gridview selected row data to Word, Excel, CSV, Pdf File  in Asp.net</h4>
                        <b>Note:</b> By default it'll export all data
                    </td>
                </tr>
                <tr>
                    <td colspan="3">&nbsp;</td>
                </tr>
                <tr>
                    <td colspan="3">
                        <asp:Button ID="btnExportToWord" runat="server" Text="ExportToWord"
                            OnClick="btnExportToWord_Click" />&nbsp;&nbsp;
                        <asp:Button ID="btnExportToExcel" runat="server" Text="ExportToExcel"
                            OnClick="btnExportToExcel_Click" />&nbsp;&nbsp;
                        <asp:Button ID="btnExportToCSV" runat="server" Text="ExportToCSV"
                            OnClick="btnExportToCSV_Click" />&nbsp;&nbsp;
                        <asp:Button ID="btnExportToText" runat="server" Text="ExportToText"
                            OnClick="btnExportToText_Click" />&nbsp;&nbsp;
                        <asp:Button ID="btnExportToPdf" runat="server" Text="ExportToPdf"
                            OnClick="btnExportToPdf_Click" />&nbsp;&nbsp;
                        <asp:Button ID="btnSendMail" runat="server" Text="Send Mail"
                            OnClick="btnSendMail_Click" />
                    </td>
                </tr>
                <tr>
                    <td colspan="3">
                        <asp:GridView ID="grdResultDetails" runat="server" AutoGenerateColumns="false"
                            DataKeyNames="SubjectId" AllowPaging="true" PageSize="5"
                            OnPageIndexChanging="grdResultDetails_PageIndexChanging">
                            <HeaderStyle BackColor="#9a9a9a" ForeColor="White" Font-Bold="true" Height="30" />
                            <PagerStyle HorizontalAlign="Center" />
                            <Columns>
                                <asp:TemplateField>
                                    <ItemTemplate>
                                        <asp:CheckBox ID="chkSelectRow" runat="server" />
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:BoundField DataField="SubjectId" HeaderText="SubjectID"
                                    ItemStyle-Width="100" ItemStyle-HorizontalAlign="Center" />
                                <asp:BoundField DataField="SubjectName" HeaderText="SubjectName"
                                    ItemStyle-Width="200" ItemStyle-HorizontalAlign="Center" />
                                <asp:BoundField DataField="Marks" HeaderText="Marks"
                                    ItemStyle-Width="200" ItemStyle-HorizontalAlign="Center" />
                                <asp:BoundField DataField="Grade" HeaderText="Grade"
                                    ItemStyle-Width="200" ItemStyle-HorizontalAlign="Center" />
                            </Columns>
                        </asp:GridView>
                    </td>
                </tr>
            </table>
            <asp:Label ID="lblMsg" runat="server" />
        </div>
    </form>
</body>
</html>

After copying HTML Markup, now it’s time to add required .dll and namespace references to code-behind file. To add reference to your project Right Click on References > Add New Reference > Browse to itextsharp.dll > OK.

Note: We need itextsharp.dll to export data to Pdf file (only requires for pdf export, if you don’t want export to pdf functionality, then simply ignore itextsharp.dll and remove reference from the sample project).I already added itextsharp.dll in my sample code. If you want to get more details about itextsharp.dll, visit itextsharp official site here.

After adding the reference, choose a required language (C# or Vb.net), and then copy paste the following code to your code-behind file.

Export GridView Data to Word, Excel, Text, Pdf In C#

First add the following namespaces to your .cs page:

using System.Data;
using System.IO;
using System.Text;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.pdf;
using System.Data.SqlClient;
using System.Collections;
using System.Net.Mail;

Then add the following code snippet to your code-behind file which helps you to keep selected rows on PageIndexChanging event and maintain the state of the selected rows to export that rows with paging:

//Call on gridview page rowIndex change
protected void grdResultDetails_PageIndexChanging(object sender, GridViewPageEventArgs e) {
    //Save checked rows before page change
    SaveCheckedStates();
    grdResultDetails.PageIndex = e.NewPageIndex;
    LoadGridData();

    //Populate cheked items with its checked status
    PopulateCheckedStates();
}

//Save the state of row checkboxes
private void SaveCheckedStates() {
    ArrayList objSubjectAL = new ArrayList();
    int rowIndex = -1;
    foreach (GridViewRow row in grdResultDetails.Rows) {
        rowIndex = Convert.ToInt32(grdResultDetails.DataKeys[row.RowIndex].Value);
        bool isSelected = ((CheckBox)row.FindControl("chkSelectRow")).Checked;
        if (ViewState["SELECTED_ROWS"] != null) {
            objSubjectAL = (ArrayList)ViewState["SELECTED_ROWS"];
        }
        if (isSelected) {
            if (!objSubjectAL.Contains(rowIndex)) {
                objSubjectAL.Add(rowIndex);
            }
        } else {
            objSubjectAL.Remove(rowIndex);
        }
    }
    if (objSubjectAL != null && objSubjectAL.Count > 0) {
        ViewState["SELECTED_ROWS"] = objSubjectAL;
    }
}

//Populate the saved checked checkbox status
private void PopulateCheckedStates() {
    ArrayList objSubjectAL = (ArrayList)ViewState["SELECTED_ROWS"];
    if (objSubjectAL != null && objSubjectAL.Count > 0) {
        foreach (GridViewRow row in grdResultDetails.Rows) {
            int rowIndex = Convert.ToInt32(grdResultDetails.DataKeys[row.RowIndex].Value);
            if (objSubjectAL.Contains(rowIndex)) {
                CheckBox chkSelectRow = (CheckBox)row.FindControl("chkSelectRow");
                chkSelectRow.Checked = true;
            }
        }
    }
}

Now here are the common functions to export gridview data to word, excel, csv, pdf, text files:

//1st Method: To Export to Word, Excel file
private void ExportFile(string fileName, string contentType) {
    SaveCheckedStates();

    //disable paging to export all pages data and make sure to bind griddata before begin
    grdResultDetails.AllowPaging = false;
    LoadGridData();
    Response.ClearContent();
    Response.Buffer = true;
    Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName));
    Response.ContentType = contentType;
    StringWriter objSW = new StringWriter();
    HtmlTextWriter objHW = new HtmlTextWriter(objSW);
    grdResultDetails.HeaderRow.Style.Add("background-color", "#fff");
    grdResultDetails.Columns[0].Visible = false;
    for (int i = 0; i < grdResultDetails.HeaderRow.Cells.Count; i++) {
        grdResultDetails.HeaderRow.Cells[i].Style.Add("background-color", "#9a9a9a");
    }
    if (ViewState["SELECTED_ROWS"] != null) {
        ArrayList objSelectedRowsAL = (ArrayList)ViewState["SELECTED_ROWS"];
        for (int j = 0; j < grdResultDetails.Rows.Count; j++) {
            GridViewRow row = grdResultDetails.Rows[j];
            int rowIndex = Convert.ToInt32(grdResultDetails.DataKeys[row.RowIndex].Value);
            if (!objSelectedRowsAL.Contains(rowIndex)) {
                //make invisible because row is not checked
                row.Visible = false;
            }
        }
    }
    grdResultDetails.RenderControl(objHW);
    Response.Write(objSW);
    Response.End();
}

//2nd Method: To Export to CSV, Text file
private void ExportTextBasedFile(string fileName, string contentType) {
    SaveCheckedStates();

    //disable paging to export all data and make sure to bind griddata before begin
    grdResultDetails.AllowPaging = false;
    LoadGridData();

    Response.ClearContent();
    Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName));
    Response.ContentType = contentType;
    StringBuilder objSB = new StringBuilder();
    grdResultDetails.Columns[0].Visible = false;
    for (int i = 1; i < grdResultDetails.Columns.Count; i++) {
        objSB.Append(grdResultDetails.Columns[i].HeaderText + ',');
    }
    objSB.Append("\n");

    ArrayList objSelectedRowsAL = (ArrayList)ViewState["SELECTED_ROWS"];
    for (int j = 0; j < grdResultDetails.Rows.Count; j++) {
        bool isRowSelected = true;
        if (ViewState["SELECTED_ROWS"] != null) {
            GridViewRow row = grdResultDetails.Rows[j];
            int rowIndex = Convert.ToInt32(grdResultDetails.DataKeys[row.RowIndex].Value);
            isRowSelected = objSelectedRowsAL.Contains(rowIndex);
        }
        if (isRowSelected) {
            //if row is selected then add row to csv file, else ignore row
            for (int k = 1; k < grdResultDetails.Columns.Count; k++) {
                objSB.Append(grdResultDetails.Rows[j].Cells[k].Text + ',');
            }
            objSB.Append("\n");
        }
    }

    Response.Write(objSB.ToString());
    Response.End();
}

And call each function on specific button event as follows:

//Method for Export to Word
protected void btnExportToWord_Click(object sender, EventArgs e) {
    string fileName = "ExportToWord_" + DateTime.Now.ToShortDateString() + ".doc",
    contentType = "application/ms-word";
    
    //call 1st export method with filename and contenttype
    ExportFile(fileName, contentType);
}

//Method for Export to Excel
protected void btnExportToExcel_Click(object sender, EventArgs e) {
    string fileName = "ExportToExcel_" + DateTime.Now.ToShortDateString() + ".xls",
    contentType = "application/vnd.ms-excel";

    //call 1st export method with filename and contenttype
    ExportFile(fileName, contentType);
}

/* Method for Export to CSV
   Note: CSV file is a text representation so we can't style .csv document */
protected void btnExportToCSV_Click(object sender, EventArgs e) {
    string fileName = "ExportToCsv_" + DateTime.Now.ToShortDateString() + ".csv",
    contentType = "application/text";

    //call 2nd export method with filename and contenttype
    ExportTextBasedFile(fileName, contentType);
}

/* Method for Export to Text
   Note: TEXT file is a text representation so we can't style .txt document */
protected void btnExportToText_Click(object sender, EventArgs e) {
    string fileName = "ExportToText_" + DateTime.Now.ToShortDateString() + ".txt",
    contentType = "application/text";

    //call 2nd export method with filename and contenttype
    ExportTextBasedFile(fileName, contentType);
}

Following is the method to export Gridview to PDF file in C#:

//Method for export gridview to pdf
protected void btnExportToPdf_Click(object sender, EventArgs e) {
    SaveCheckedStates();

    //disable paging to export all data and make sure to bind griddata before begin
    grdResultDetails.AllowPaging = false;
    LoadGridData(); string fileName = "ExportToPdf_" + DateTime.Now.ToShortDateString();
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", string.Format("attachment; filename={0}",
    fileName + ".pdf"));
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    StringWriter objSW = new StringWriter();
    HtmlTextWriter objTW = new HtmlTextWriter(objSW);
    grdResultDetails.Columns[0].Visible = false;
    if (ViewState["SELECTED_ROWS"] != null) {
        ArrayList objSelectedRowsAL = (ArrayList)ViewState["SELECTED_ROWS"];
        for (int j = 0; j < grdResultDetails.Rows.Count; j++) {
            GridViewRow row = grdResultDetails.Rows[j];
            int rowIndex = Convert.ToInt32(grdResultDetails.DataKeys[row.RowIndex].Value);
            if (!objSelectedRowsAL.Contains(rowIndex)) {
                //make invisible because row is not checked
                row.Visible = false;
            }
        }
    }
    grdResultDetails.RenderControl(objTW);
    StringReader objSR = new StringReader(objSW.ToString());
    Document objPDF = new Document(PageSize.A4, 100f, 100f, 100f, 100f);
    HTMLWorker objHW = new HTMLWorker(objPDF);
    PdfWriter.GetInstance(objPDF, Response.OutputStream);
    objPDF.Open();
    objHW.Parse(objSR);
    objPDF.Close();
    Response.Write(objPDF);
    Response.End();
}

Export GridView Data to Word, Excel, Text, Pdf In Vb.net

First add the following namespaces to your .vb page:

Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.html.simpleparser
Imports iTextSharp.text.pdf
Imports System.Data.SqlClient
Imports System.Net.Mail

Then add the following code snippet to your code-behind file which helps you to keep selected rows on PageIndexChanging event and maintain the state of the selected rows to export that rows with paging:

'Call on gridview page rowIndex change'
Protected Sub grdResultDetails_PageIndexChanging(ByVal sender As Object, ByVal e As GridViewPageEventArgs)
    'Save checked rows before page change'
    SaveCheckedStates()
    grdResultDetails.PageIndex = e.NewPageIndex
    LoadGridData()
    'Populate cheked items with its checked status'
    PopulateCheckedStates()
End Sub

'Save the state of row checkboxes'
Private Sub SaveCheckedStates()
    Dim objSubjectAL As New ArrayList()
    Dim rowIndex As Integer = -1
    For Each row As GridViewRow In grdResultDetails.Rows
        rowIndex = Convert.ToInt32(grdResultDetails.DataKeys(row.RowIndex).Value)
        Dim isSelected As Boolean = CType(row.FindControl("chkSelectRow"), CheckBox).Checked
        If ViewState("SELECTED_ROWS") IsNot Nothing Then
            objSubjectAL = CType(ViewState("SELECTED_ROWS"), ArrayList)
        End If
        If isSelected Then
            If Not objSubjectAL.Contains(rowIndex) Then
                objSubjectAL.Add(rowIndex)
            End If
        Else
            objSubjectAL.Remove(rowIndex)
        End If
    Next row
    If objSubjectAL IsNot Nothing AndAlso objSubjectAL.Count > 0 Then
        ViewState("SELECTED_ROWS") = objSubjectAL
    End If
End Sub

'Populate the saved checked checkbox status'
Private Sub PopulateCheckedStates()
    Dim objSubjectAL As ArrayList = CType(ViewState("SELECTED_ROWS"), ArrayList)
    If objSubjectAL IsNot Nothing AndAlso objSubjectAL.Count > 0 Then
        For Each row As GridViewRow In grdResultDetails.Rows
            Dim rowIndex As Integer = Convert.ToInt32(grdResultDetails.DataKeys(row.RowIndex).Value)
            If objSubjectAL.Contains(rowIndex) Then
                Dim chkSelectRow As CheckBox = CType(row.FindControl("chkSelectRow"), CheckBox)
                chkSelectRow.Checked = True
            End If
        Next row
    End If
End Sub

Now here are the common functions to export gridview data to word, excel, csv, pdf, text files:

'1st Method: To Export to Word, Excel file'
Private Sub ExportFile(ByVal fileName As String, ByVal contentType As String)
    SaveCheckedStates()

    'disable paging to export all pages data and make sure to bind griddata before begin'
    grdResultDetails.AllowPaging = False
    LoadGridData()
    Response.ClearContent()
    Response.Buffer = True
    Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName))
    Response.ContentType = contentType
    Dim objSW As New StringWriter()
    Dim objHW As New HtmlTextWriter(objSW)
    grdResultDetails.HeaderRow.Style.Add("background-color", "#fff")
    grdResultDetails.Columns(0).Visible = False
    For i As Integer = 0 To grdResultDetails.HeaderRow.Cells.Count - 1
        grdResultDetails.HeaderRow.Cells(i).Style.Add("background-color", "#9a9a9a")
    Next i
    If ViewState("SELECTED_ROWS") IsNot Nothing Then
        Dim objSelectedRowsAL As ArrayList = CType(ViewState("SELECTED_ROWS"), ArrayList)
        For j As Integer = 0 To grdResultDetails.Rows.Count - 1
            Dim row As GridViewRow = grdResultDetails.Rows(j)
            Dim rowIndex As Integer = Convert.ToInt32(grdResultDetails.DataKeys(row.RowIndex).Value)
            If Not objSelectedRowsAL.Contains(rowIndex) Then
                'make invisible because row is not checked'
                row.Visible = False
            End If
        Next j
    End If
    grdResultDetails.RenderControl(objHW)
    Response.Write(objSW)
    Response.End()
End Sub

'2nd Method: To export gridview to CSV, Text file'
Private Sub ExportTextBasedFile(ByVal fileName As String, ByVal contentType As String)
    SaveCheckedStates()

    'disable paging to export all data and make sure to bind griddata before begin'
    grdResultDetails.AllowPaging = False
    LoadGridData()

    Response.ClearContent()
    Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName))
    Response.ContentType = contentType
    Dim objSB As New StringBuilder()
    grdResultDetails.Columns(0).Visible = False
    For i As Integer = 1 To grdResultDetails.Columns.Count - 1
        objSB.Append(grdResultDetails.Columns(i).HeaderText)
        objSB.Append(","c)
    Next i
    objSB.Append(ControlChars.Lf)

    Dim objSelectedRowsAL As ArrayList = CType(ViewState("SELECTED_ROWS"), ArrayList)
    For j As Integer = 0 To grdResultDetails.Rows.Count - 1
        Dim isRowSelected As Boolean = True
        If ViewState("SELECTED_ROWS") IsNot Nothing Then
            Dim row As GridViewRow = grdResultDetails.Rows(j)
            Dim rowIndex As Integer = Convert.ToInt32(grdResultDetails.DataKeys(row.RowIndex).Value)
            isRowSelected = objSelectedRowsAL.Contains(rowIndex)
        End If
        If isRowSelected Then
            'if row is selected then add row to csv file, else ignore row'
            For k As Integer = 1 To grdResultDetails.Columns.Count - 1
                objSB.Append(grdResultDetails.Rows(j).Cells(k).Text)
                objSB.Append(","c)
            Next k
            objSB.Append(ControlChars.Lf)
        End If
    Next j

    Response.Write(objSB.ToString())
    Response.End()
End Sub

And call each function on a specific button event as follows:

'Method for Export to Word'
Protected Sub btnExportToWord_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim fileName As String = "ExportToWord_" & Date.Now.ToShortDateString() & ".doc",
            contentType As String = "application/ms-word"

    'call 1st export method with filename and content type
    ExportFile(fileName, contentType)
End Sub

'Method for export gridview to excel'
Protected Sub btnExportToExcel_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim fileName As String = "ExportToExcel_" & Date.Now.ToShortDateString() & ".xls",
            contentType As String = "application/vnd.ms-excel"

    'call 1st export method with filename and contenttype
    ExportFile(fileName, contentType)
End Sub

'Method for export gridview to csv'
'Note: CSV file is a text representation so we can't style .csv document'
Protected Sub btnExportToCSV_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim fileName As String = "ExportToCsv_" & Date.Now.ToShortDateString() & ".csv",
            contentType As String = "application/text"

    'call 2nd export method with filename and contenttype
    ExportTextBasedFile(fileName, contentType)
End Sub

'Method for Export to Text'
'Note: TEXT file is a text representation so we can't style .txt document'
Protected Sub btnExportToText_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim fileName As String = "ExportToText_" & Date.Now.ToShortDateString() & ".txt",
            contentType As String = "application/text"

    'call 2nd export method with filename and contenttype'
    ExportTextBasedFile(fileName, contentType)
End Sub

Following is the method to export gridview to pdf file in vb.net:

'Method for Export to PDF'
Protected Sub btnExportToPdf_Click(ByVal sender As Object, ByVal e As EventArgs)
    SaveCheckedStates()

    'disable paging to export all data and make sure to bind griddata before begin'
    grdResultDetails.AllowPaging = False
    LoadGridData()

    Dim fileName As String = "ExportToPdf_" & Date.Now.ToShortDateString()
    Response.ContentType = "application/pdf"
    Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName & ".pdf"))
    Response.Cache.SetCacheability(HttpCacheability.NoCache)
    Dim objSW As New StringWriter()
    Dim objTW As New HtmlTextWriter(objSW)
    grdResultDetails.Columns(0).Visible = False
    If ViewState("SELECTED_ROWS") IsNot Nothing Then
        Dim objSelectedRowsAL As ArrayList = CType(ViewState("SELECTED_ROWS"), ArrayList)
        For j As Integer = 0 To grdResultDetails.Rows.Count - 1
            Dim row As GridViewRow = grdResultDetails.Rows(j)
            Dim rowIndex As Integer = Convert.ToInt32(grdResultDetails.DataKeys(row.RowIndex).Value)
            If Not objSelectedRowsAL.Contains(rowIndex) Then
                'make invisible because row is not checked'
                row.Visible = False
            End If
        Next j
    End If
    grdResultDetails.RenderControl(objTW)
    Dim objSR As New StringReader(objSW.ToString())
    Dim objPDF As New Document(PageSize.A4, 100.0F, 100.0F, 100.0F, 100.0F)
    Dim objHW As New HTMLWorker(objPDF)
    PdfWriter.GetInstance(objPDF, Response.OutputStream)
    objPDF.Open()
    objHW.Parse(objSR)
    objPDF.Close()
    Response.Write(objPDF)
    Response.End()
End Sub

Function To Send GridView Selected Row Data As Email Body

I guess you all know about how to send mail using smtp in asp.net. Also check out my previous tutorial on how to send gridview data in mail using asp.net c# or vb.net. Following function allows you to send only gridview selected rows in mail.

If you are using C# as code-behind, use the following code:

//Method To Send Mail
protected void btnSendMail_Click(object sender, EventArgs e) {
    try {
        string Subject = "This is test mail with gridview data",
        Body = GridViewToHtml(grdResultDetails),
        ToEmail = "toemail@domain.com"; string SMTPUser = "email@domain.com", SMTPPassword = "password";
        MailMessage mail = new MailMessage();

        //set the sender address of the mail message
        mail.From = new System.Net.Mail.MailAddress(SMTPUser, "AspnetO");
        mail.To.Add(ToEmail);
        mail.Subject = Subject;
        mail.Body = Body;
        mail.IsBodyHtml = true;
        mail.Priority = System.Net.Mail.MailPriority.Normal;
        SmtpClient smtp = new SmtpClient();

        //chnage your host, port number
        smtp.Host = "smtp.gmail.com";
        smtp.Port = 25; //or you can also use port# 587

        //provide smtp credentials to authenticate to your account
        smtp.Credentials = new System.Net.NetworkCredential(SMTPUser, SMTPPassword);

        //if you are using secure authentication using SSL/TLS then "true" else "false"
        smtp.EnableSsl = true;
        smtp.Send(mail);
        lblMsg.Text = "Success: Mail sent successfully!";
        lblMsg.ForeColor = System.Drawing.Color.Green;
    } catch (SmtpException ex) {
        //catched smtp exception
        lblMsg.Text = "SMTP Exception: " + ex.Message.ToString();
        lblMsg.ForeColor = System.Drawing.Color.Red;
    } catch (Exception ex) {
        lblMsg.Text = "Error: " + ex.Message.ToString();
        lblMsg.ForeColor = System.Drawing.Color.Red;
    }
}

//Method To Convert Gridview To HTML formatted String
private string GridViewToHtml(GridView grdResultDetails) {
    SaveCheckedStates();
    grdResultDetails.AllowPaging = false;
    LoadGridData();
    StringBuilder objSB = new StringBuilder();
    StringWriter objSW = new StringWriter(objSB);
    HtmlTextWriter objHW = new HtmlTextWriter(objSW);
    if (ViewState["SELECTED_ROWS"] != null) {
        ArrayList objSelectedRowsAL = (ArrayList)ViewState["SELECTED_ROWS"];
        for (int j = 0; j < grdResultDetails.Rows.Count; j++) {
            GridViewRow row = grdResultDetails.Rows[j];
            int rowIndex = Convert.ToInt32(grdResultDetails.DataKeys[row.RowIndex].Value);
            if (!objSelectedRowsAL.Contains(rowIndex)) {
                //make invisible because row is not checked
                row.Visible = false;
            }
        }
    }
    grdResultDetails.RenderControl(objHW);
    return objSB.ToString();
}

If you are using Vb.net as code-behind, use following code:

'Method To Send Mail'
Protected Sub btnSendMail_Click(ByVal sender As Object, ByVal e As EventArgs)
    Try
        Dim Subject As String = "This is test mail with gridview data",
            Body As String = GridViewToHtml(grdResultDetails),
            ToEmail As String = "toemail@domain.com"
        Dim SMTPUser As String = "email@domain.com", SMTPPassword As String = "password"
        Dim mail As New MailMessage()

        'set the sender address of the mail message'
        mail.From = New System.Net.Mail.MailAddress(SMTPUser, "AspnetO")
        mail.To.Add(ToEmail)
        mail.Subject = Subject
        mail.Body = Body
        mail.IsBodyHtml = True
        mail.Priority = System.Net.Mail.MailPriority.Normal
        Dim smtp As New SmtpClient()

        'chnage your host, port number'
        smtp.Host = "smtp.gmail.com"
        smtp.Port = 25 'or you can also use port# 587'

        'provide smtp credentials to authenticate to your account'
        smtp.Credentials = New System.Net.NetworkCredential(SMTPUser, SMTPPassword)

        'if you are using secure authentication using SSL/TLS then "true" else "false"'
        smtp.EnableSsl = True
        smtp.Send(mail)
        lblMsg.Text = "Success: Mail sent successfully!"
        lblMsg.ForeColor = System.Drawing.Color.Green
    Catch ex As SmtpException
        'catched smtp exception
        lblMsg.Text = "SMTP Exception: " & ex.Message.ToString()
        lblMsg.ForeColor = System.Drawing.Color.Red
    Catch ex As Exception
        lblMsg.Text = "Error: " & ex.Message.ToString()
        lblMsg.ForeColor = System.Drawing.Color.Red
    End Try
End Sub

'Method To Convert Gridview To HTML formatted String'
Private Function GridViewToHtml(ByVal grdResultDetails As GridView) As String
    SaveCheckedStates()
    grdResultDetails.AllowPaging = False
    LoadGridData()
    Dim objSB As New StringBuilder()
    Dim objSW As New StringWriter(objSB)
    Dim objHW As New HtmlTextWriter(objSW)
    If ViewState("SELECTED_ROWS") IsNot Nothing Then
        Dim objSelectedRowsAL As ArrayList = CType(ViewState("SELECTED_ROWS"), ArrayList)
        For j As Integer = 0 To grdResultDetails.Rows.Count - 1
            Dim row As GridViewRow = grdResultDetails.Rows(j)
            Dim rowIndex As Integer = Convert.ToInt32(grdResultDetails.DataKeys(row.RowIndex).Value)
            If Not objSelectedRowsAL.Contains(rowIndex) Then
                'make invisible because row is not checked'
                row.Visible = False
            End If
        Next j
    End If
    grdResultDetails.RenderControl(objHW)
    Return objSB.ToString()
End Function

During Development, I Faced Following Errors:

Control ‘grdResultDetails’ of type ‘GridView’ must be placed inside a form tag with runat=server

Server Error in ‘/’ Application.


Control ‘grdResultDetails’ of 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 ‘grdResultDetails’ of type ‘GridView’ must be placed inside a form tag with runat=server.

To resolve this issue, please check how to solve control ‘grdResultDetails’ of type ‘GridView’ must be placed inside a form tag with runat=server.

RegisterForEventValidation can only be called during Render();

Server Error in ‘/’ Application.


RegisterForEventValidation can only be called during Render();

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.InvalidOperationException: RegisterForEventValidation can only be called during Render();

To resolve this issue, please check how to solve RegisterForEventValidation can only be called during Render();.

Example Result

Export gridview data to word, excel, text, pdf in asp.net
Export gridview data to word, excel, text, pdf in asp.net

Download Sample Code

Previous articleExport GridView Data to Word Excel Text Pdf File in Asp.net C# Vb
Next articleControl ‘GridView1’ of type ‘GridView’ must be placed inside a form tag with runat=server
Hi there, I am Mayank, the man behind Technical Mack. I started AspnetO with a motive to educate people on various programming languages ranging from beginners to expert level. Through this blog, I aim to provide more insightful content.

4 COMMENTS

  1. Hi. I used your code for export now i need to this excel content as body for email purpose, could you please update it. i want thank you for the wonderful code used above.. its working well….

LEAVE A REPLY

Please enter your comment!
Please enter your name here

five − 3 =