2016-08-05 49 views
0

Ich habe versucht, eine einfache Methode zum Exportieren von GridViews in Excel-Tabellen zu implementieren. Allerdings bin ich jetzt auf diesem für eine ganze Weile fest:ASP.NET: Die richtige Methode zum Exportieren von GridView nach Excel einschließlich dynamisch hinzugefügter Zeilen

Mein GridViewAutoGenerateColumns Set true hat, wie die Datenquelle dynamisch ist und nicht wirklich vorhersehbar (Anzahl der Spalten im Laufe der Zeit ändern). Die HeaderRow erstellt es automatisch ist für mich nicht geeignet, also auch ShowHeader-false gesetzt Ich habe und meine eigene in OnRowCreated Fall wie folgt aus:

if (e.Row.RowType == DataControlRowType.Header) { 

     gv.Controls[0].Controls.AddAt(0, GetHeader()); 
     gv.Controls[0].Controls.AddAt(1, GetSubHeader()); 


} 

wo GetHeader() und beide GetSubHeader() ein GridViewRow (es gibt zwei Rück Zeilen in der Kopfzeile mit verschiedenen Colspans, Rowspans und so). Das alles funktioniert gut auf der Website, aber wenn ich versuche, die GridView mit OpenXML wie diese zu exportieren:

ExcelPackage excel = new ExcelPackage(); 
    var workSheet = excel.Workbook.Worksheets.Add("List 1"); 
    var totalCols = gv.Rows[0].Cells.Count; 
    var totalRows = gv.Rows.Count; 
    var headerRow = gv.HeaderRow; 

    for (int i = 0; i < totalCols; i++) { 

     workSheet.Cells[1,i+1].Value = headerRow.Cells[i].Text; 

    } 

    for (int i = 0; i < totalCols; i++) { 

     for (int j = 0; j < totalRows; j++) { 

      workSheet.Cells[j+2,i+1].Value = gv.Rows[j].Cells[i].Text; 

     } 

    } 

    return excel; 

was ich eine Tabelle mit dem ursprünglichen HeaderRow ist, die versteckt ist - ich habe gedacht, ich überspringen soll der erste Zyklus offensichtlich - und dann die Zeilen mit den tatsächlichen Daten. Keine Spur der zwei Zeilen, die ich in OnRowCreated hinzugefügt habe.

Könnte jemand bitte erklären, warum das passiert und wie ich das ausarbeiten kann? Die Methode sollte idealerweise immer das gesamte GridView so exportieren, wie es auf der Website angezeigt wird.

Hinweis: Der andere Weg mit HtmlTextWriter und GridView.RenderControl() ist wahrscheinlich keine Option, da ich nicht in der Lage war, die Datei in Excel nach dem Download zu öffnen (OpenOffice ging gut) und dann las ich irgendwo, dass die Blätter nicht sind tatsächlich nutzbar für die Datenverarbeitung, die in diesem Fall entscheidend ist.

EDIT: Nachdem ich die beiden HeaderRow s in OnRowDataBound statt OnRowCreated hinzugefügt, für sie die Schleife Konten, aber alles, was in dem Arbeitsblatt bekommt sind leere Felder, und es scheint auch, dass sie nicht berücksichtigt werden durch gv.Rows.Count, wie Die Schleife erreicht nie die letzten zwei Zeilen in meiner Tabelle.

versuchte ich, das Debuggen und und in der Tat alles, was von gv.Rows[j].Cells[i].Text; ist ein "" zurückgegeben wird, obwohl die Zellen ihre Text Eigenschaft einrichten und die Tabelle zeigt auf der Website OK.

Ich finde dieses Verhalten sehr verwirrend, ich denke, ich vermisse etwas Großes. Kann mir jemand sagen, warum das passiert?

Antwort

1

Es spielt keine Rolle, ob es automatisch generiert wird oder nicht. Der Trick besteht darin, alles als ein Objekt und ein Kind eines Objekts zu behandeln. Anschließend können Sie mithilfe der Eigenschaften des Objekts (und auch Excel's) die Daten in der Gridview bearbeiten.

Siehe folgende Beispielcode

protected void ExportToExcel(object sender, EventArgs e) 

{ 

    Response.Clear(); 

    Response.Buffer = true; 

    Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.xls"); 

    Response.Charset = ""; 

    Response.ContentType = "application/vnd.ms-excel"; 

    using (StringWriter sw = new StringWriter()) 

    { 

     HtmlTextWriter hw = new HtmlTextWriter(sw); 



     //To Export all pages 

     GridView1.AllowPaging = false; 

     this.BindGrid(); 



     GridView1.HeaderRow.BackColor = Color.White; 

     foreach (TableCell cell in GridView1.HeaderRow.Cells) 

     { 

      cell.BackColor = GridView1.HeaderStyle.BackColor; 

     } 

     foreach (GridViewRow row in GridView1.Rows) 

     { 

      row.BackColor = Color.White; 

      foreach (TableCell cell in row.Cells) 

      { 

       if (row.RowIndex % 2 == 0) 

       { 

        cell.BackColor = GridView1.AlternatingRowStyle.BackColor; 

       } 

       else 

       { 

        cell.BackColor = GridView1.RowStyle.BackColor; 

       } 

       cell.CssClass = "textmode"; 

      } 

     } 



     GridView1.RenderControl(hw); 



     //style to format numbers to string 

     string style = @"<style> .textmode { } </style>"; 

     Response.Write(style); 

     Response.Output.Write(sw.ToString()); 

     Response.Flush(); 

     Response.End(); 

    } 

} 

Dies ist nur einer der Wege zu gehen.

Es gibt viele andere Proben. Googeln Sie einfach Gridview nach Excel.

Hoffe, das hilft.

+0

Danke, aber wie ich oben erwähnt habe, funktioniert dies nicht, da Excel die heruntergeladene Datei nicht öffnen will. OpenOffice öffnet es jedoch ohne Probleme, was für mich sehr rätselhaft ist. – Epsiloney

+0

Ich sehe aus Ihrem Code, dass Sie die ExcelPackage-Klasse verwenden. Wenn Ihr Code funktioniert, versuchen Sie es mit der Excel-Klasse. Und wie gesagt, meine Antwort ist nur ein Weg. Es gibt viele andere Beispiele. Mach einfach eine Suche. –