none
Error Exception of type 'System.OutOfMemoryException' was thrown. :(

    Pregunta

  • Estimados, este es mi primer post, la verdad siempre reviso el foro y de la misma forma resuelvo problemas pero en esta oportunidad tengo un problema que no he podido solucionar.

    el tema es que tengo una aplicacion asp.net c#, la cual hace reportes, consiste en que el usuario selecciona un tipo de reporte y la web ejecuta el procedimiento de almacenado, estos datos se guardan en un datatable y luego  se crea un excel a través de XML como paso final la web nos permite descargar el reporte en excel.

    la clase que genera el excel no tiene problemas, funciona muy bien con varios reportes y su rowLimit = 1048575.

    el problema esta en que al exportar uno de estos sale el siguiente error Exception of type 'System.OutOfMemoryException' was thrown.

    la exception es la siguiente:

    System.OutOfMemoryException was unhandled by user code

      Message="Exception of type 'System.OutOfMemoryException' was thrown."

      Source="MiProyecto"

      StackTrace:

           at  MiProyecto.site.Excel.GenerarExcel(String nombreReporte, Dictionary<string, DataTable> hojasExcel) in

    D:\Proyectos\ MiProyecto\site\Excel.aspx.cs:line 54

           at  MiProyecto.site.Excel.Page_Load(Object sender, EventArgs e) in D:\Proyectos\MiProyecto\site\Excel.aspx.cs:line 24

           at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)

           at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)

           at System.Web.UI.Control.OnLoad(EventArgs e)

           at System.Web.UI.Control.LoadRecursive()

           at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

      InnerException: 

    El error ocurre al momento de querer generar un excel con 33.000 filas lo que hace que el archivo.xls tenga un tamaño superior a los 100 mb
    ¿sera algo correspondiente al buffer?
    hay que establecer alguna propiedad en la session?
    como les dije, pasa solo con los archivos excel que superan los 100MB el resto funciona correcto.
    espero que me puedan ayudar y tambien espero poder participar en la comunidad.
    saludos
    Fernando Bachur.

    lunes, 09 de enero de 2012 12:09

Respuestas

Todas las respuestas

  • hola

    estas volcando alguna imagen en la exportacion a excel ?

    lo pregunto porque 33000 filas no podrian pesar 100Mb nunca, ese tamaño es porque estas incluyendo algo que lleva el excel a ese tamaño y ese seguro es el problema

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 09 de enero de 2012 12:16
  • Hola, la verdad no carga imagenes... y revisando bien el reporte el procedimiento de almacenado trae 577.676 filas y tiene 46 columnas y tiene una demora de ejecución de 22 segundos. Al momento de generar ese reporte cae con "Exception of type 'System.OutOfMemoryException' was thrown." lo captura en Excel.aspx.cs  en:

     catch (Exception ex)

                {

                    throw ex;

                }

    en esta clase:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Data;
    using System.Text;
    using System.Reflection;
    using System.Globalization;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using MiDLL;
    
    
    namespace Miproyecto.site
    {
        public partial class Excel : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    string reporte = Session["reporte"].ToString();
                    Dictionary<string, DataTable> hojasExcel = (Dictionary<string, DataTable>)Session["hojasExcel"];
                    GenerarExcel(reporte, hojasExcel);
                    Session.Remove("reporte");
                    Session.Remove("hojasExcel");
                }
            }
    
            private void GenerarExcel(string nombreReporte, Dictionary<string, DataTable> hojasExcel)
            {
                try
                {
                    var ds = new DataSet();
                    string attachment = "attachment; filename=" + nombreReporte + ".xls";
    
                    foreach (KeyValuePair<string, DataTable> hojas in hojasExcel)
                        ds.Tables.Add(hojas.Value);
    
                    var excelXml = Miproyecto.Excel.GetExcelXml(ds, nombreReporte);
                    Response.ClearContent();
                    Response.AddHeader("content-disposition", attachment);
                    Response.ContentType = "application/vnd.ms-excel";
                    Response.ContentEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
                    Response.Write(excelXml);
                    Response.End();
                }
                catch (System.Threading.ThreadAbortException ex)
                {
                    //esta exception se gatilla desde la generacion del excel, no hacer nada...
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }
    

    no se en realidad que esta pasando... algo no esta controlado lo que hace el outofmemory...

    y bueno los datos recien exporte el procedimiento a un excel, como te digo, el excel tiene solo texto y su tamaño fisico es de 121 MB (recien exporte el Procedimiento to file)... tengo varios repotes que manejan 20.000 filas y tienen un tamaño de 20 mb aprox y funcionan sin problemas... me parece que esta netamente en el tamaño del archivo, ahora tambien revise la documentacion de microsoft en cuanto a Datatable y el objeto si soporta esa cantidad de registros entonce lo descarte...

    mm.. se me escapa un poco al ser mi primera experiencia con este error...
    alguna idea?

    saludos

    Fernando Bachur. 

    lunes, 09 de enero de 2012 12:39
  • pero habias comentado que eran 33000 filas, no 577.000

    recuerda que excel solo soporta maximo 65000

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 09 de enero de 2012 12:54
  • bueno, tienes razón, trabajo con un monton de reportes y uso un schema de excel en xml, no se a que version corresponde pero tiene declarado el rowlimit lo que me indica que esta bajo las propiedades de excel 2007, si fuese asi, tendria un soporte para 1.000.000 de filas aprox segun la documentacion de Microsoft... estoy revisando la clase excel donde esta declarado el schema, pero la extensión sigue siendo .xls. creo que tienes razón desde ese punto de vista, seguramente la clase excel esta generando documentos en version 2003.- buscare algun schema xml de excel que genere documentos en otras versiones para ver si ese es el problema... si tienes alguna información tu seria de mucha ayuda.

    saludos y gracias por tu atención.

     

    Fernando Bachur.

    lunes, 09 de enero de 2012 13:09
  • estas seguro que ese rowlimit no es para las tablas pivite del excel ?

    Excel specifications and limits

    si veo que excel tiene ampliado los limites

    pero como aseguras que cuando exportas lo haces a un excel 2007 o superior y no una version anterior

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 09 de enero de 2012 13:25
  • tal como comente anteriormente "  no se a que version corresponde pero tiene declarado el rowlimit lo que me indica que esta bajo las propiedades de excel 2007," la verdad tengo un schema definido, es el siguiente:

    private static string getWorkbookTemplate()
            {
                var sb = new StringBuilder(818);
                sb.AppendFormat(@"<?xml version=""1.0"" encoding=""ISO-8859-1""?>{0}", Environment.NewLine);
                sb.AppendFormat(@"<?mso-application progid=""Excel.Sheet""?>{0}", Environment.NewLine);
                sb.AppendFormat(@"<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet""{0}", Environment.NewLine);
                sb.AppendFormat(@" xmlns:o=""urn:schemas-microsoft-com:office:office""{0}", Environment.NewLine);
                sb.AppendFormat(@" xmlns:x=""urn:schemas-microsoft-com:office:excel""{0}", Environment.NewLine);
                sb.AppendFormat(@" xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet""{0}", Environment.NewLine);
                sb.AppendFormat(@" xmlns:html=""http://www.w3.org/TR/REC-html40"">{0}", Environment.NewLine);
                sb.AppendFormat(@" <Styles>{0}", Environment.NewLine);
                sb.AppendFormat(@"  <Style ss:ID=""Default"" ss:Name=""Normal"">{0}", Environment.NewLine);
                sb.AppendFormat(@"   <Alignment ss:Vertical=""Bottom""/>{0}", Environment.NewLine);
                sb.AppendFormat(@"   <Borders/>{0}", Environment.NewLine);
                sb.AppendFormat(@"   <Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""/>{0}", Environment.NewLine);
                sb.AppendFormat(@"   <Interior/>{0}", Environment.NewLine);
                sb.AppendFormat(@"   <NumberFormat/>{0}", Environment.NewLine);
                sb.AppendFormat(@"   <Protection/>{0}", Environment.NewLine);
                sb.AppendFormat(@"  </Style>{0}", Environment.NewLine);
                sb.AppendFormat(@"  <Style ss:ID=""s62"">{0}", Environment.NewLine);
                sb.AppendFormat(@"   <Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""{0}", Environment.NewLine);
                sb.AppendFormat(@"    ss:Bold=""1""/>{0}", Environment.NewLine);
                sb.AppendFormat(@"  </Style>{0}", Environment.NewLine);
                sb.AppendFormat(@"  <Style ss:ID=""s63"">{0}", Environment.NewLine);
                sb.AppendFormat(@"   <NumberFormat ss:Format=""Short Date""/>{0}", Environment.NewLine);
                sb.AppendFormat(@"  </Style>{0}", Environment.NewLine);
                sb.AppendFormat(@" </Styles>{0}", Environment.NewLine);
                sb.Append(@"{0}\r\n</Workbook>");
                return sb.ToString();
            }
    

    y esto genera un .xls a pesar de que tiene declarado un rowlimit de 1048575.

    estoy viendo la opcion de implementar openXML a pesar que no conosco esa libreria lo intentare.

    respecto a mi schema busque informacion y en todos los sitios sale declarado de la misma manera.

    debo descartar y tengo 2 sospechas, el tamaño del archivo y la version del excel. 

    espero solucionarlo pronto... 

    muchas gracias 

    Fernando Bachur.


    lunes, 09 de enero de 2012 13:45
  • hola

    porque no usas

    ClosedXML - The easy way to OpenXML

    si la idea es usar openxml esta libreria te ayudara mucho

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 09 de enero de 2012 14:26
  • que bien... revisare tu link con eso podre descartar si es la version del archivo o el peso del mismo, 

    muchas gracias.

    Fernando Bachur

    lunes, 09 de enero de 2012 14:59