Mi primer intento fue utilizando el GridView
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
var grid = new GridView(); grid.DataSource = from r in recibos select new { Expedicion = r.FechaExpedicion, Expediente = r.NumeroExpediente, Desde = r.FechaDesde, Hasta = r.FechaHasta, Precio = r.PrecioTotal, }; grid.DataBind(); Response.ClearContent(); Response.ContentType = "application/excel"; Response.AddHeader("content-disposition", "attachment; filename=recibos.xls"); StringWriter sw = new StringWriter(); HtmlTextWriter htmlTextWriter = new HtmlTextWriter(sw); grid.RenderControl(htmlTextWriter); Response.Write(sw.ToString()); Response.Flush(); Response.End(); |
El problema es que obtenía este error:
“The file you are trying to open, ‘recibos.xls’ is in a different format than specified by the file extension. Verify that the file is not corrupted and is from a trusted source before opening the file. Do you want to open the file now?”
Por curiosidad vi en un editor de texto el contenido del fichero y resulta que contenía código Html.
En un post maravilloso de Matías López https://matiaslopezdev.wordpress.com/2014/04/22/trabajando-con-excel-en-net/ indica las posibilidades y cual consideraba la mejor.
Como recomendaba utilice la librería EPPlus, funciona realmente bien y es bastante sencilla.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
//Lo primero es tener los datos var recibosexcel = from rw in recibosweb join r in recibos on rw.IdReciboWeb equals r.IdRecibo orderby r.Año descending, r.Mes descending select new { rw.Mes, rw.Año, rw.Recibo, r.Total }; using (var excelPackage=new ExcelPackage()) { //Propiedades del archivo excelPackage.Workbook.Properties.Author = "Masanasa "; excelPackage.Workbook.Properties.Title = " Exportación Recibos"; //Propiedades Hoja de excel var sheet = excelPackage.Workbook.Worksheets.Add("recibos"); sheet.Name = "Recibos"; //Empezamos a escribir sobre ella. var rowindex=1 //Hago un Merge de primeras 4 columnas para poner el titulo. sheet.Cells[1, 1].Value = "LISTADO RECIBOS " ; sheet.Cells[1, 1, 1, 4].Merge = true; //Se puede poner un comentario en una celda sheet.Cells[1, 1].AddComment("Listado de recibos", "Masanasa"); rowindex = 3; //Pongo los encabezados del excel var col = 1; sheet.Cells[rowindex, col++].Value = "Mes"; sheet.Cells[rowindex,col++].Value= "Año"; sheet.Cells[rowindex, col++].Value = "Nº Recibo"; sheet.Cells[rowindex, col++].Value = "Total"; rowindex = 4; //Recorro los recibos y los ponemos en el Excel foreach (var r in recibosexcel) { col = 1; sheet.Cells[rowindex, col++].Value = r.Mes; sheet.Cells[rowindex, col++].Value = r.Año; sheet.Cells[rowindex, col++].Value = r.Recibo; sheet.Cells[rowindex, col++].Value = r.Total; rowindex++; } // Ancho de celdas sheet.Cells.AutoFitColumns(); //Establezco diseño al excel utilizando un diseño predefinido var range = sheet.Cells[3, 1, rowindex, 4]; var table = sheet.Tables.Add(range, "tabla"); table.TableStyle = TableStyles.Dark9; //Ya lo tengo ahora lo devuelvo utilizo el Response porque es Web, sino puedes guardarlo directamente Response.ClearContent(); Response.BinaryWrite(excelPackage.GetAsByteArray()); Response.AddHeader("content-disposition", "attachment;filename=recibos.xlsx"); Response.ContentType = "application/excel"; Response.Flush(); Response.End(); } |
Solo necesite utilizar estas, hay muchísimas más posibilidades, incrustar gráficos, imágenes, crear varias hojas ..etc
Holas, , eh revisado tu post, y necesito que al hacer clic en un boton, me exporte a excel, en el controlador eh puesto de esta manera, pero sale error, no se si sea la manera correcta, cabe mencionar que instale la libbreria.Por favor alguna idea, gracias.
Pongo el código, que pues en el controlador:
public void ExportToExcel_formulario(Stream stream)
{
// gv.DataSource = db.formulario.ToList();
var recibosexcel = from cust in db.formulario
select cust;
using (var excelPackage = new ExcelPackage())
{
//Propiedades del archivo
excelPackage.Workbook.Properties.Author = “Masanasa “;
excelPackage.Workbook.Properties.Title = ” Exportación Recibos”;
//Propiedades Hoja de excel
var sheet = excelPackage.Workbook.Worksheets.Add(“recibos”);
sheet.Name = “Recibos”;
//Empezamos a escribir sobre ella.
var rowindex = 1;
//Hago un Merge de primeras 4 columnas para poner el titulo.
sheet.Cells[1, 1].Value = “LISTADO RECIBOS “;
sheet.Cells[1, 1, 1, 4].Merge = true;
//Se puede poner un comentario en una celda
sheet.Cells[1, 1].AddComment(“Listado de recibos”, “Masanasa”);
rowindex = 3;
//Pongo los encabezados del excel
var col = 1;
sheet.Cells[rowindex, col++].Value = “Mes”;
sheet.Cells[rowindex, col++].Value = “Año”;
sheet.Cells[rowindex, col++].Value = “Nº Recibo”;
sheet.Cells[rowindex, col++].Value = “Total”;
rowindex = 4;
//Recorro los recibos y los ponemos en el Excel
foreach (var r in recibosexcel)
{
col = 1;
sheet.Cells[rowindex, col++].Value = r.titulo;
rowindex++;
}
// Ancho de celdas
sheet.Cells.AutoFitColumns();
//Establezco diseño al excel utilizando un diseño predefinido
var range = sheet.Cells[3, 1, rowindex, 4];
var table = sheet.Tables.Add(range, “tabla”);
table.TableStyle = TableStyles.Dark9;
//Ya lo tengo ahora lo devuelvo utilizo el Response porque es Web, sino puedes guardarlo directamente
Response.ClearContent();
Response.BinaryWrite(excelPackage.GetAsByteArray());
Response.AddHeader(“content-disposition”, “attachment;filename=recibos.xlsx”);
Response.ContentType = “application/excel”;
Response.Flush();
Response.End();
}
}
el error, al ejecutar el boton exportar a excel.
———————————————————
Error de servidor en la aplicación ‘/’.
No se puede crear una clase abstract.
Hola
El error que indicas, parece no tener referencia con la exportación, sino de la definición de tus clases.
Espero que te sea util
Creo que el error viene por el tipo de clase que has creado
No se puede crear una clase abstract
Ya me dices
Como puedo escribir datos en dos hojas diferentes???
Hola Erika
Es sencillo para crear cada hoja debes usar excelPackage.Workbook.Worksheets.Add
En el ejemplo tienes creada la hoja Recibos
var sheet = excelPackage.Workbook.Worksheets.Add(“recibos”);
sheet.Name = “Recibos”;
Puedes crear otra por ejemplo para clientes
var sheet2 = excelPackage.Workbook.Worksheets.Add(“clientes”);
sheet2.Name = “Clientes”;
Espero que te ayude.
Hola Aplique tu ejemplo pero los resultados de mi lista, me aparecen 4 filas abajo de mi encabezado y no puedo identificar por que crees poder orientarme