2016-12-22 5 views
0

Ich habe eine GridView mit 75000 Datensätze. Die Daten werden in wenigen Tagen zunehmen. Ich habe keine Probleme beim Aufrufen der Benutzeroberfläche, da ich Paging verwende. Beim Exportieren in Excel schlagen nun alle Blogs vor, die Seitennummerierung zu entfernen und dann das Gitter erneut zu exportieren. Während dieses Vorgangs schlägt die Datenbank jedoch mit der Ausnahme wegen zu wenig Arbeitsspeicher fehl. Bitte helfen Sie. Ich habe sogar versucht, auf Datatable zu laden und zu einer neuen Gridview neu zu laden.Grid Binding Fehler beim Exportieren

(Hinzugefügt mein Code unten, zur Zeit wird dies mehrere Male nur die letzte Seite im Netz Looping)

try 
     { 
      GrdReport.AllowPaging = false; 
      LoadReportData(); 
      int a = GrdReport.PageIndex; 
      if (GrdReport.PageCount <= 650) 
      { 
       DataTable dt = new DataTable(); 
       for (int i = 0; i < GrdReport.PageCount; i++) 
       { 
        GrdReport.PageIndex = i; 
        //GrdReport.SetPageIndex(a); 

        if (i == 0) 
        { 
         for (int k = 0; k < GrdReport.HeaderRow.Cells.Count; k++) 
         { 

          if (GrdReport.HeaderRow.Cells[k].HasControls()) 
          { 
                    if (GrdReport.HeaderRow.Cells[k].Controls[0] is LinkButton) 
           { 
            LinkButton headerControl = GrdReport.HeaderRow.Cells[k].Controls[0] as LinkButton; 
            string headerName = headerControl.Text; 
            dt.Columns.Add(headerName); 
           } 

          } 
         } 
        } 

        foreach (GridViewRow row in GrdReport.Rows) 
        { 

         dt.Rows.Add(); 
         for (int j = 0; j < row.Cells.Count; j++) 
         { 
          dt.Rows[dt.Rows.Count - 1][j] = row.Cells[j].Text; 
         } 
        } 
       } 
       int x = dt.Rows.Count; 
       int y = dt.Columns.Count; 
       GrdReport.SetPageIndex(a); 

       Session["New"] = dt; 
       HttpResponse Response = HttpContext.Current.Response; 
       Response.Redirect("ExportToExcelHandler.ashx?gv=" + Session["New"], false); 

      } 

      else 
      { 
       lblErr.Text = "Result exceeds 65000 records. Please modify search criteria to reduce records."; 
       lblErr.Visible = true; 
      } 
     } 

Und dies ist der Code in Handler:

public class ExportToExcelHandler : System.Web.UI.Page, IHttpHandler, IRequiresSessionState 
{ 

    public new void ProcessRequest(HttpContext context) 
    { 
     GridView grid = new GridView(); 
     this.EnableViewState = false;   
     grid.DataSource = (DataTable)HttpContext.Current.Session["New"]; 
     grid.DataBind(); 
     HttpResponse Response = HttpContext.Current.Response; 
     Response.Clear(); 
     Response.AddHeader("content-disposition", "attachment;filename=Results.xls"); 
     Response.Charset = ""; 
     Response.ContentType = "application/vnd.ms-excel"; 
     StringWriter StringWriter = new StringWriter();   
     HtmlTextWriter HtmlTextWriter = new System.Web.UI.HtmlTextWriter(Response.Output);    
     grid.RenderControl(HtmlTextWriter); 
     Response.End(); 
    } 

    public new bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 
+0

Was passiert, wenn Sie nur 1000 Datensätze exportieren, noch abstürzen? – TrevorBrooks

+0

1000 Datensätze exportiert gut. – krrish602

+0

Was verwenden Sie, um nach Excel zu exportieren? Sparen Sie als HTML? –

Antwort

0

Eine HTML-Datei mit Die XLS-Erweiterung ist keine echte MS-Excel-Datei. MS Excel kann nur lesen und Daten anzeigen.

Das Speichern großer HTML-Dateien führt zu einer hohen Speicherzuweisung und ist zeitaufwendig.

Sie sollten eine Excel-Bibliothek wie EasyXLS verwenden, die xls oder xlsx Excel-Dateien speichert und eine bessere Speicherverwaltung hat.

Überprüfen Sie die folgenden Links für Richtungen:
Export Gridview to Excel in C#
und
Export large Excel files in C#

+0

Ich bekomme immer noch aus dem Speicher Ausnahme, indem Sie diese http://www.easyxls.com/manual/FAQ/export-gridview-to-excel.html – krrish602

+0

erhalten Sie nur aus dem Speicher, wenn Sie die Datentabelle bevölkern? oder wenn Sie workbook.easy_WriteXLSFile_FromDataSet verwenden? –

+0

Ich habe den Code wie folgt geändert: dataSet = ((DataSet) GrdReport.DataSource); und hinzugefügt Response.Flush anstelle von Response.End(); Jetzt bekomme ich keinen Fehler, aber ich sehe keine Excel-Datei. – krrish602

Verwandte Themen