net mvc exportar create asp and excel c#-4.0 asp.net-mvc-4 export-to-excel

create - exportar excel mvc 5



El archivo que intenta abrir tiene un formato diferente al especificado por la extensión de archivo en Asp.Net (4)

el archivo que está intentando abrir tiene un formato diferente al especificado por el error de extensión de archivo c # al intentar abrir el archivo en Excel.

Aqui esta mi codigo

public ActionResult Export(string filterBy) { MemoryStream output = new MemoryStream(); StreamWriter writer = new StreamWriter(output, Encoding.UTF8); var data = City.GetAll().Select(o => new { CountryName = o.CountryName, StateName = o.StateName, o.City.Name, Title = o.City.STDCode }).ToList(); var grid = new GridView { DataSource = data }; grid.DataBind(); var htw = new HtmlTextWriter(writer); grid.RenderControl(htw); writer.Flush(); output.Position = 0; return File(output, "application/vnd.ms-excel", "test.xls"); }

cuando estoy tratando de abrir Excel me sale este error

el archivo que intenta abrir tiene un formato diferente al especificado por la extensión de archivo

Después de hacer clic en Sí, el archivo se abre correctamente. pero no quiero que aparezca este mensaje.


el archivo que intenta abrir tiene un formato diferente al especificado por la extensión de archivo

Recibe constantemente ese mensaje de advertencia porque el archivo que se creó no es un archivo de Excel real. Si miras en el archivo generado, es solo un grupo de etiquetas html. Recuerde que el RenderControl de GridView generará una tabla html.

Para solucionar su problema, debe utilizar una herramienta de terceros que cree un archivo de Excel real (una herramienta que podría querer usar es NPOI ) o crear un archivo delimitado por comas, o simplemente un archivo csv, y devolver ese archivo.


En caso de que alguien más se tropiece con esto ... Necesitaba convertir blobs de nuevo en archivos sobre la marcha en C #. Pdf ha funcionado bien y excel me dio el mismo error que explica OP.

Este es el código que escribí, que maneja excel de manera diferente a otros tipos de archivos.

La aplicación de Excel / octet-stream con un nombre de archivo real solucionó mi problema. Probablemente no sea la forma más limpia de hacerlo, pero fue lo suficientemente buena para mis propósitos.

string theExt = Path.GetExtension(theDoc.documentFileName).ToUpper(); Response.Clear(); if (theExt == ".XLS" || theExt == ".XLSX"){ Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", string.Format("inline; filename={0}", theDoc.documentFileName)); } else{ Response.ContentType = theDoc.documentMimeType; Response.AddHeader("Content-Disposition", string.Format("inline; filename={0}", theDoc.documentTitle)); } using (MemoryStream stream = new MemoryStream(theDoc.file)) { stream.WriteTo(Response.OutputStream); stream.Close(); }; Response.End();


En caso de que alguien necesite exportar un conjunto de datos como archivo excel con CloseXML .

Dataset ds = { your data from db } var xlsx = new XLWorkbook(); var dataTable = ds.Tables[0]; xlsx.Worksheets.Add(dataTable); xlsx.SaveAs("export.xlsx");


He utilizado CloseXML para resolver el problema.

public static void ExportToExcel(IEnumerable<dynamic> data, string sheetName) { XLWorkbook wb = new XLWorkbook(); var ws = wb.Worksheets.Add(sheetName); ws.Cell(2, 1).InsertTable(data); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; HttpContext.Current.Response.AddHeader("content-disposition", String.Format(@"attachment;filename={0}.xlsx",sheetName.Replace(" ","_"))); using (MemoryStream memoryStream = new MemoryStream()) { wb.SaveAs(memoryStream); memoryStream.WriteTo(HttpContext.Current.Response.OutputStream); memoryStream.Close(); } HttpContext.Current.Response.End(); }

Instalé ClosedXML en mi proyecto usando Nuget Package Manager .