2012-07-18 45 views
14

Tengo un problema extraño aquí con EPPlus para crear algunos archivos .XLSX. Tengo un paquete que se está creando y luego se envía a la respuesta.EPPlus Error al generar .XLSX a la respuesta

he creado un paquete de la siguiente manera:

var file = new FileInfo(@"C:\Test.xlsx"); 
ExcelPackage package = new ExcelPackage(file); 
//...code to output data...// 
package.Save(); 

Esto guarda el archivo en mi unidad C: local correctamente, y cuando lo abro funciona muy bien. No hay errores ni nada, el formato es correcto, etc.

Sin embargo, ahora deseo salida de este archivo para la secuencia de respuesta, así que he modificado el código que tenía que tener este aspecto:

ExcelPackage package = new ExcelPackage(); 
//...code to output data...// 
MemoryStream result = new MemoryStream(); 
package.SaveAs(result); 
context.Response.Clear(); 
context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";              
context.Response.AddHeader("Content-Disposition", "attachment;filename=MissionDetails.xlsx"); 
result.WriteTo(context.Response.OutputStream); 
context.Response.End(); 

pero cuando me ejecutar este código me sale el siguiente mensaje al intentar abrir el archivo de Excel:

Excel found unreadable content in filename.xlsx. Do you want to recover the contents of this workbook? If you trust the source of this workbook, click Yes

clic en Sí a continuación, muestra el siguiente mensaje:

This file cannot be opened by using Microsoft Excel. Do you want to search the Microsoft Office Online Web site for a converter that can open the file?

selecciono No aquí y entonces se abre el archivo de Excel y muestra este error:

Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.

PERO el archivo a continuación, carga bien y parece estar formateado correctamente y todo. Pero cada vez que intento abrir el archivo, me da las mismas indicaciones y un mensaje de error.

Note: The code to output the data does not change for either of these scenarios.

¿Alguien ha visto algo como esto? ¿O tiene alguna idea de lo que podría hacer que esto guarde el archivo incorrectamente solo al enviar a la respuesta?

+0

¿Se puede simplificar el contenido del archivo para fines de prueba (es decir, simplemente establecer el valor de una sola celda) para asegurarse de que no haya ningún problema con el contenido del archivo en lugar de la transmisión de archivos? – JustinStolle

+0

Como se dijo, el contenido es el mismo que cuando lo guardo en el disco duro. Y lo he probado y verificado que no es el contenido que agrego a la celda. Debe ser un problema con la respuesta. – j00b

+0

Por lo tanto, cree un archivo extremadamente simple para transmitir para verificar que es donde reside el problema; es posible que no tenga nada que ver con EPPlus si ese es el caso. – JustinStolle

Respuesta

0

En lugar del método WriteTo, intente esto:

context.Response.BinaryWrite(package.GetAsByteArray()); 
+1

Intenté eso y encontré que da el siguiente error cuando intento abrir el archivo: "Excel no puede abrir el archivo '(nombre de archivo)'. Xlsx 'porque el formato de archivo o la extensión de archivo no son válidos. Verifique que el archivo no se ha dañado y que la extensión del archivo coincide con el formato del archivo ". – j00b

+0

¿Qué versión de Office/Excel estás usando? Es posible que necesite actualizar o usar un paquete de compatibilidad (consulte http://www.microsoft.com/en-us/download/details.aspx?id=3). – JustinStolle

+0

Creo que necesitaría Excel 2007 o posterior para leer el nuevo formato compatible con Open Office XML que crea el paquete EPPlus. – JustinStolle

13

he encontrado la solución a este problema! Como era de esperar, tuvo algo que ver con la respuesta, ya que pude abrir el archivo cuando lo guardé localmente, pero no a través de la respuesta.

La cuestión aquí es que mi código fue envuelto en un bloque try..catch, donde se está registrando y se visualiza la excepción.

llegó a mi atención que cuando se llama a Response.End() un System.Threading.ThreadAbortExceptionse eleva. Cuando esto se plantea, parece que el resultado del error se adjuntó al final de mi archivo.

Cuando me deshice del registro de errores para esa excepción específica, ¡funcionó muy bien!

favor refiérase a este mensaje para obtener más información http://epplus.codeplex.com/discussions/223843?ProjectName=epplus

//...output code...// 
catch(Exception ex){ 
    if (!(ex is System.Threading.ThreadAbortException)) 
    { 
     //Log other errors here 
    } 
} 
+1

en vs2008 la excepción se plantea en Response.Flush(). Elimino el método y luego el archivo se abre correctamente sin ningún error. – user1131926

0

Page.aspx.código cs cuando clic de botón para la exportación a Excel

string templateFileName = Server.MapPath("~/ReportingTemplate/test.xlsx"); 
       System.IO.FileInfo templateFile = new System.IO.FileInfo(templateFileName); 

       String message = ExcelPackagePlusLibrary.EPPlus.ExportToExcel(templateFile, dt, false, exportFileName, Response, "Data", "Summary", "Please type the client name here"); 
       if (String.IsNullOrEmpty(message) == false) 
       { 
        /* Exception occur. */ 
       } 
       dt.Clear(); 
/////////////////////////////////////////////////////////////////////////////////////// 

    /// <summary> 
      /// ExportToExcel is a method used for Export To Excel with template file. 
      /// 
      /// </summary> 
      /// <param name="templateFile">The fully qualified name of the new file, or the relative file name. Do not end the path with the directory separator character.</param> 
      /// <param name="dt">Datatable for export.</param> 
      /// <param name="printHeaders">Datatable's header used or not, when Export it. </param> 
      /// <param name="exportFileName">provide fileName only not path. </param> 
      /// <param name="Response">System.Web.HttpResponse. </param> 
      /// <param name="sheetNames">arg[0] means provide sheet name where you want to load data. \n (Optional Parameter) arg[1] means provide sheet name where you want to edit. (Optional Parameter) arg[2] means if your intention is to Edit sheet so provide searchText.</param> 
      /// 
      public static string ExportToExcel(FileInfo templateFile, DataTable dt, bool printHeaders, string exportFileName, System.Web.HttpResponse Response, params String[] sheetNames) 
      { 
       try 
       { 
        using (ExcelPackage p = new ExcelPackage(templateFile, false)) 
        { 
         EPPlus.AddSheetWithTemplate(p, dt, sheetNames[0], printHeaders); 


         String[] clientName = exportFileName.Split(new char[] { '_' }, 2); 

         if (sheetNames.Count() > 2) 
         { 
          ExcelPackagePlusLibrary.EPPlus.EditSheet(p, sheetNames[1], sheetNames[2], clientName[0] ?? exportFileName); 
         } 

         Byte[] fileBytes = p.GetAsByteArray(); //Read the Excel file in a byte array 

         //Clear the response 
         Response.ClearHeaders(); 
         Response.ClearContent(); 
         Response.Clear(); 

         //Response.Cookies.Clear(); 


         //Add the header & other information 
         //Response.Cache.SetCacheability(System.Web.HttpCacheability.Private); 
         //Response.CacheControl = "private"; 
         //Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; 
         //Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; 
         //Response.AppendHeader("Content-Length", fileBytes.Length.ToString()); 
         //Response.AppendHeader("Pragma", "cache"); 
         //Response.AppendHeader("Expires", "60"); 
         Response.AddHeader("Content-Disposition", 
         "attachment; " + 
         "filename=" + exportFileName + "; " + 
         "size=" + fileBytes.Length.ToString() + "; " + 
         "creation-date=" + DateTime.Now.ToString("R").Replace(",", "") + "; " + 
         "modification-date=" + DateTime.Now.ToString("R").Replace(",", "") + "; " + 
         "read-date=" + DateTime.Now.ToString("R").Replace(",", "")); 

         //Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
         Response.ContentType = "application/x-msexcel"; 

         //Write it back to the client 
         Response.BinaryWrite(fileBytes); 
         Response.Flush(); 
         Response.Close(); 

         /* Download to Client Side. */ 
         //DirectoryInfo dir = new DirectoryInfo(Server.MapPath("~/Testing/Downloaded/" + DateTime.Now.ToString("MM-dd-yyyy"))); 
         //if (!dir.Exists) 
         //{ 
         // dir.Create(); 
         //} 
         //File.WriteAllBytes(dir.FullName + "\\" + fileName, fileBytes); 

         return String.Empty; 
        } 
       } 
       catch (Exception ex) 
       { 
        _ErrorMessage = ex.Message.ToString(); 
        return _ErrorMessage; 
       } 
      } 
8

gracias joob su enlace soved mi problema se llama "GetAsByteArray()". Haciendo lo que se enumera a continuación y en el enlace que proporcionó, i gess evita que se anexe la excepción. por algunos majic.

¡usted consigue y sube voto!

mrxrsd 
Editor 

Aug 17, 2010 at 12:30 PM 


Call response.clear before send stream back to client. 

        Response.Clear(); 
        Response.AddHeader("content-disposition", "attachment; filename=file.xlsx"); 
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";     
        Response.BinaryWrite(pck.GetAsByteArray()); 
        Response.End(); 

http://epplus.codeplex.com/discussions/223843?ProjectName=epplus

0

no pude conseguir EPPlus para abrir el IE, se guardan bien y abrirse sin errores. (Chrome funcionó bien tanto para guardar como para abrir). Las sugerencias aquí no me funcionaron, posiblemente porque estaba usando un archivo aspx, no un archivo ashx que funcionó para mí al final.

Después de horas de búsqueda terminé usando un archivo ashx como por this stackoverflow post y lo tengo funcionando en todos los navegadores ahora sin advertencias/mensajes de archivos corupt usando EPPlus.

recursos adicionales que pueden ayudar a los demás:

espero que esto salvar a otra persona algún tiempo.

Cuestiones relacionadas