In this article I will explain how to export ASP.Net GridView data to Excel file and then sending it as file attachment in email without saving the exporting Excel file on disk.
The GridView data will be first fetched into a DataTable and then the DataTable will be exported into an Excel Sheet using OpenXml and ClosedXml Excel libraries.
Download DocumentFormat.OpenXml and ClosedXml Libraries
You can download the libraries using the following download locations.
Note: You will need to install the OpenXml SDK 2.0 in your Windows Operating System.
Database
I have made use of the following table Customers with the schema as follows.
I have already inserted few records in the table.
Note: You can download the database table SQL by clicking the download link below.
HTML Markup
The HTML Markup consists of an ASP.Net GridView with three columns and a Button to export GridView to Excel and send as email attachment.
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="CustomerId" HeaderText="Customer Id" ItemStyle-Width="80" />
<asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-Width="120" />
<asp:BoundField DataField="Country" HeaderText="Country" ItemStyle-Width="120" />
</Columns>
</asp:GridView>
<br />
<asp:Button Text="Export" OnClick="ExportExcel" runat="server" />
Namespaces
You will need to import the following namespaces.
C#
using System.IO;
using System.Data;
using ClosedXML.Excel;
using System.Net.Mail;
using System.Configuration;
using System.Data.SqlClient;
VB.Net
Imports System.IO
Imports System.Data
Imports ClosedXML.Excel
Imports System.Net.Mail
Imports System.Configuration
Imports System.Data.SqlClient
Binding the GridView
The GridView is populated with the records from the Customers table inside the Page Load event of the page.
C#
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
GridView1.DataSource = this.GetData();
GridView1.DataBind();
}
}
private DataTable GetData()
{
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);
return dt;
}
}
}
}
}
VB.Net
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
If Not Me.IsPostBack Then
GridView1.DataSource = Me.GetData()
GridView1.DataBind()
End If
End Sub
Private Function GetData() As DataTable
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)
Return dt
End Using
End Using
End Using
End Using
End Function
Exporting GridView to Excel and sending as File Attachment in Email
When the Export button is clicked, the following event handler is executed. A DataTable is populated with records from the Customers table.
Then a Workbook object is created to which the DataTable is added as Worksheet using the Add method which accepts DataTable and the name of the Sheet as parameters.
Once the DataTable is added as a Worksheet to the Workbook, the WorkBook is saved to a MemoryStream which ultimately is converted to a Byte array.
Finally the Byte Array is added as attachment to the MailMessage object and the Email is sent.
Note: I am using Gmail Mail settings for this example, but you can use settings of any Mail Server of your choice.
C#
protected void ExportExcel(object sender, EventArgs e)
{
//Get the GridView Data from database.
DataTable dt = GetData();
//Set DataTable Name which will be the name of Excel Sheet.
dt.TableName = "GridView_Data";
//Create a New Workbook.
using (XLWorkbook wb = new XLWorkbook())
{
//Add the DataTable as Excel Worksheet.
wb.Worksheets.Add(dt);
using (MemoryStream memoryStream = new MemoryStream())
{
//Save the Excel Workbook to MemoryStream.
wb.SaveAs(memoryStream);
//Convert MemoryStream to Byte array.
byte[] bytes = memoryStream.ToArray();
memoryStream.Close();
//Send Email with Excel attachment.
using (MailMessage mm = new MailMessage("sender@gmail.com", "recipient@gmail.com"))
{
mm.Subject = "GridView Exported Excel";
mm.Body = "GridView Exported Excel Attachment";
//Add Byte array as Attachment.
mm.Attachments.Add(new Attachment(new MemoryStream(bytes), "GridView.xlsx"));
mm.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.EnableSsl = true;
System.Net.NetworkCredential credentials = new System.Net.NetworkCredential();
credentials.UserName = "sender@gmail.com";
credentials.Password = "<password>";
smtp.UseDefaultCredentials = true;
smtp.Credentials = credentials;
smtp.Port = 587;
smtp.Send(mm);
}
}
}
}
VB.Net
Protected Sub ExportExcel(sender As Object, e As EventArgs)
'Get the GridView Data from database.
Dim dt As DataTable = GetData()
'Set DataTable Name which will be the name of Excel Sheet.
dt.TableName = "GridView_Data"
'Create a New Workbook.
Using wb As New XLWorkbook()
'Add the DataTable as Excel Worksheet.
wb.Worksheets.Add(dt)
Using memoryStream As New MemoryStream()
'Save the Excel Workbook to MemoryStream.
wb.SaveAs(memoryStream)
'Convert MemoryStream to Byte array.
Dim bytes As Byte() = memoryStream.ToArray()
memoryStream.Close()
'Send Email with Excel attachment.
Using mm As New MailMessage("sender@gmail.com", "recipient@gmail.com")
mm.Subject = "GridView Exported Excel"
mm.Body = "GridView Exported Excel Attachment"
'Add Byte array as Attachment.
mm.Attachments.Add(New Attachment(New MemoryStream(bytes), "GridView.xlsx"))
mm.IsBodyHtml = True
Dim smtp As New SmtpClient()
smtp.Host = "smtp.gmail.com"
smtp.EnableSsl = True
Dim credentials As New System.Net.NetworkCredential()
credentials.UserName = "sender@gmail.com"
credentials.Password = "<password>"
smtp.UseDefaultCredentials = True
smtp.Credentials = credentials
smtp.Port = 587
smtp.Send(mm)
End Using
End Using
End Using
End Sub
Exported GridView Excel as attachment in Gmail Mailbox
Exported GridView Excel opened up in Google Document Viewer
Downloads