Essa semana tive que exportar os dados de uma GridView para uma planilha Excel, bom… sabia que não era algo muito complicado, mas também nunca tinha feito, sendo assim realizei uma busca no grande mestre Google e encontrei uma classe que me atendeu muito bem. Fácil e descomplicado.
using
using System;
using System.Data;
using System.Configuration;
using System.IO;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace SGM.CTA.Web.UI
{
publicclassGridViewExportUtil
{
///<summary>
/// Realiza a exportao de grid para Excell
///</summary>
///<param name=”fileName”>Nome do Arquivo</param>
///<param name=”gv”>GridView preenchida com os dados necessrios</param>
publicstaticvoid Export(string fileName, GridView gv)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader(
“content-disposition”, string.Format(“attachment; filename={0}”, fileName));
HttpContext.Current.Response.ContentType =
“application/ms-excel”;
using (StringWriter sw = newStringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
// Create a form to contain the grid
Table table =
new Table();
// add the header row to the table
if (gv.HeaderRow != null)
{
//adiciona a cor
gv.HeaderRow.BackColor = System.Drawing.Color.AliceBlue;
//Prepara informao header
GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
table.Rows.Add(gv.HeaderRow);
}
// add each of the data rows to the table
foreach (GridViewRow row in gv.Rows)
{
GridViewExportUtil.PrepareControlForExport(row);
table.Rows.Add(row);
}
// add the footer row to the table
if (gv.FooterRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
table.Rows.Add(gv.FooterRow);
}
// render the table into the htmlwriter
table.RenderControl(htw);
// render the htmlwriter into the response
HttpContext.Current.Response.Write(sw.ToString());
HttpContext.Current.Response.End();
}
}
}
///<summary>
/// Replace any of the contained controls with literals
///</summary>
///<param name=”control”></param>
privatestaticvoid PrepareControlForExport(Control control)
{
for (int i = 0; i < control.Controls.Count; i++)
{
Control current = control.Controls[i];
if (current is LinkButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i,
new LiteralControl((current as LinkButton).Text));
}
elseif (current is ImageButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i,
new LiteralControl((current as ImageButton).AlternateText));
}
elseif (current is HyperLink)
{
control.Controls.Remove(current);
control.Controls.AddAt(i,
new LiteralControl((current as HyperLink).Text));
}
elseif (current is DropDownList)
{
control.Controls.Remove(current);
control.Controls.AddAt(i,
new LiteralControl((current as DropDownList).SelectedItem.Text));
}
elseif (current is CheckBox)
{
control.Controls.Remove(current);
control.Controls.AddAt(i,
new LiteralControl((current as CheckBox).Checked ? “True” : “False”));
}
if (current.HasControls())
{
GridViewExportUtil.PrepareControlForExport(current);
}
}
}
}
}
Para utilizar no seu evento do botão você pode adicionar
GridViewExportUtil.Export(“Usuarios.xls”, this.nome_da_gridview);
Dúvidas, entrem em contato
PS: Dificil postar um código aqui no WordPress, ficou um tanto confuso, mas nada dificil de entender!