Pues hay un truco bastante efectivo que es crear un archivo .XLS con una tabla HTML. Al abrirlo, Excel muestra la tabla como si fuera un XLS de verdad.
El código sería algo así:
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);
// Para exportar todas las páginas
GridView1.AllowPaging = false;
this.BindGrid();
GridView1.HeaderRow.BackColor = Color.White;
foreach (TableCell cell in GridView1.HeaderRow.Cells)
{
cell.BackColor = GridView1.HeaderStyle.BackColor;
}
foreach (GridViewRow row in GridView1.Rows)
{
row.BackColor = Color.White;
foreach (TableCell cell in row.Cells)
{
if (row.RowIndex % 2 == 0)
{
cell.BackColor = GridView1.AlternatingRowStyle.BackColor;
}
else
{
cell.BackColor = GridView1.RowStyle.BackColor;
}
cell.CssClass = "textmode";
}
}
GridView1.RenderControl(hw);
// Estilo para formatear números como cadenas
string style = @"<style> .textmode { } </style>";
Response.Write(style);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
}
}
Otra alternativa sería usar Open XML SDK pero ya lleva bastante más trabajo aunque el resultado es un XLS nativo muy profesional.
PD: El código lo he obtenido de este artículo en inglés: Export GridView to Excel in ASP.Net with Formatting using C# and VB.Net
¡Excelente respuesta! Te me has adelantado Marc Climent ;-) - Víctor Fernández Portero