Hi Shyama,
Exporting Images to Excel using HTML export, you cannot embed base64.
Check this example. Now please take its reference and correct your code.
Database
For this example I have used tblFiles table whose schema is defined as follows.
I have already inserted few records in the table.
You can download the database table SQL by clicking the download link below.
Download SQL file
For inserting binary data in database you can refer below article.
HTML
<asp:GridView ID="gvImages" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="Id" HeaderText="Id" />
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:TemplateField HeaderText="Photo" ItemStyle-Height="100" ItemStyle-Width="100">
<ItemTemplate>
<asp:Image ID="imgPhotos" ImageUrl='<%# GetUrl(Eval("id", "Handler.ashx?Id={0}"))%>'
runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<br />
<asp:Button ID="btnExport" Text="Export" runat="server" OnClick="Export" />
Handler
C#
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.Web;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
public class Handler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
if (context.Request.QueryString["Id"] != null)
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString))
{
SqlCommand cmd = new SqlCommand("SELECT Name,ContentType,Data FROM tblFiles WHERE Id = @Id", con);
cmd.Parameters.AddWithValue("@Id", Convert.ToInt32(context.Request.QueryString["Id"]));
con.Open();
SqlDataReader sdr = cmd.ExecuteReader();
if (sdr.Read())
{
byte[] imageBytes;
using (MemoryStream stream = new MemoryStream((byte[])sdr["Data"], 0, ((byte[])sdr["Data"]).Length))
{
using (Image imgage = Image.FromStream(stream))
{
int height = 100;
int width = 100;
using (Bitmap bitmap = new Bitmap(imgage, width, height))
{
using (MemoryStream memoryStream = new MemoryStream())
{
bitmap.Save(memoryStream, ImageFormat.Jpeg);
imageBytes = memoryStream.ToArray();
}
}
}
}
context.Response.Buffer = true;
context.Response.Charset = "";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.ContentType = sdr["ContentType"].ToString();
context.Response.AddHeader("content-disposition", "attachment;filename=" + sdr["Name"].ToString());
context.Response.BinaryWrite(imageBytes);
context.Response.Flush();
context.Response.End();
}
con.Close();
}
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
VB.Net
<%@ WebHandler Language="VB" Class="Handler" %>
Imports System
Imports System.Web
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging
Public Class Handler : Implements IHttpHandler
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
If context.Request.QueryString("Id") IsNot Nothing Then
Using con As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("constr").ConnectionString)
Dim cmd As SqlCommand = New SqlCommand("SELECT Name,ContentType,Data FROM tblFiles WHERE Id = @Id", con)
cmd.Parameters.AddWithValue("@Id", Convert.ToInt32(context.Request.QueryString("Id")))
con.Open()
Dim sdr As SqlDataReader = cmd.ExecuteReader()
If sdr.Read() Then
Dim imageBytes As Byte()
Using stream As MemoryStream = New MemoryStream(CType(sdr("Data"), Byte()), 0, (CType(sdr("Data"), Byte())).Length)
Using imgage As Image = Image.FromStream(stream)
Dim height As Integer = 100
Dim width As Integer = 100
Using bitmap As Bitmap = New Bitmap(imgage, width, height)
Using memoryStream As MemoryStream = New MemoryStream()
bitmap.Save(memoryStream, ImageFormat.Jpeg)
imageBytes = memoryStream.ToArray()
End Using
End Using
End Using
End Using
context.Response.Buffer = True
context.Response.Charset = ""
context.Response.Cache.SetCacheability(HttpCacheability.NoCache)
context.Response.ContentType = sdr("ContentType").ToString()
context.Response.AddHeader("content-disposition", "attachment;filename=" & sdr("Name").ToString())
context.Response.BinaryWrite(imageBytes)
context.Response.Flush()
context.Response.End()
End If
con.Close()
End Using
End If
End Sub
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
Code
C#
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.BindGridView();
}
}
private void BindGridView()
{
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlDataAdapter sda = new SqlDataAdapter("SELECT id,Name FROM tblFiles WHERE ContentType = 'image/jpeg'", con))
{
DataTable dt = new DataTable();
sda.Fill(dt);
gvImages.DataSource = dt;
gvImages.DataBind();
}
}
}
protected void Export(object sender, EventArgs e)
{
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=GridViewImage.xls");
Response.Charset = "";
Response.ContentType = "application/vnd.ms-excel";
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
this.BindGridView();
gvImages.AllowPaging = false;
for (int i = 0; i < gvImages.Rows.Count; i++)
{
GridViewRow row = gvImages.Rows[i];
row.Attributes.Add("class", "textmode");
}
gvImages.RenderControl(hw);
string style = @"<style> .textmode { mso-number-format:\@; } </style>";
Response.Write(style);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
}
public override void VerifyRenderingInServerForm(Control control)
{
}
protected string GetUrl(string page)
{
string[] splits = Request.Url.AbsoluteUri.Split('/');
if (splits.Length >= 2)
{
string url = splits[0] + "//";
for (int i = 2; i < splits.Length - 1; i++)
{
url += splits[i];
url += "/";
}
return url + page;
}
return page;
}
VB.Net
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
If Not Me.IsPostBack Then
Me.BindGridView()
End If
End Sub
Private Sub BindGridView()
Dim constr As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString
Using con As SqlConnection = New SqlConnection(constr)
Using sda As SqlDataAdapter = New SqlDataAdapter("SELECT id,Name FROM tblFiles WHERE ContentType = 'image/jpeg'", con)
Dim dt As DataTable = New DataTable()
sda.Fill(dt)
gvImages.DataSource = dt
gvImages.DataBind()
End Using
End Using
End Sub
Protected Sub Export(ByVal sender As Object, ByVal e As EventArgs)
Response.Clear()
Response.Buffer = True
Response.AddHeader("content-disposition", "attachment;filename=GridViewImage.xls")
Response.Charset = ""
Response.ContentType = "application/vnd.ms-excel"
Dim sw As StringWriter = New StringWriter()
Dim hw As HtmlTextWriter = New HtmlTextWriter(sw)
Me.BindGridView()
gvImages.AllowPaging = False
For i As Integer = 0 To gvImages.Rows.Count - 1
Dim row As GridViewRow = gvImages.Rows(i)
row.Attributes.Add("class", "textmode")
Next
gvImages.RenderControl(hw)
Dim style As String = "<style> .textmode { mso-number-format:\@; } </style>"
Response.Write(style)
Response.Output.Write(sw.ToString())
Response.Flush()
Response.End()
End Sub
Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
End Sub
Protected Function GetUrl(ByVal page As String) As String
Dim splits As String() = Request.Url.AbsoluteUri.Split("/"c)
If splits.Length >= 2 Then
Dim url As String = splits(0) & "//"
For i As Integer = 2 To splits.Length - 2
url += splits(i)
url += "/"
Next
Return url + page
End If
Return page
End Function
Screenshot
GridView with Image
Excel After Export