Frage

Ich habe ein Problem mit der Konvertierung in Excel-Code, die ich finde. Ich arbeite an einem Website-Projekt in .NET 4.0 und habe dafür eine Klasse erstellt, die Folgendes ausführt (basierend auf http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html ):

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("content-disposition",
string.Format("attachment; filename={0}", fileName)); HttpContext.Current.Response.ContentType = "application/ms-excel"; using (StringWriter sw = new StringWriter()) {
   using (HtmlTextWriter htw = new HtmlTextWriter(sw)) {
    //Create a table to contain the grid
    //Add header row
    //Add each data row
    //Add Footer row
    //Render the table into the htmlwriter
    //  render the htmlwriter into the response
    HttpContext.Current.Response.Write(sw.ToString());
    HttpContext.Current.Response.End();
  }
}

Ich rufe diese Klasse von einem Benutzersteuerelement aus auf, das eine Schaltfläche enthält, die einer auf der Seite angezeigten GridView hinzugefügt wird. Dies funktioniert wie erwartet - klicken Sie auf die Schaltfläche. Sie erhalten eine Download-Option, mit der Sie die resultierende Excel-Tabelle mit den Daten aus der GridView öffnen oder speichern können.

Wenn ich dies jedoch über einen Linkbutton in einer anderen GridView aufrufe, möchte ich eine dynamische Gridview erstellen, die Daten enthält, und diese exportieren. Wenn ich das mache, bekomme ich eine ThreadAbortException vom Response.End-Aufruf in der Klasse.

Frage 1: Warum erhalte ich diese ThreadAbortException nicht, wenn ich denselben Code aus einer Benutzersteuerung heraus aufrufe? Erhalten Benutzersteuerungen ihre eigenen Threads oder einen anderen Kontext?

Die Suche nach dem Fehler, den ich beim Auftreten dieser ThreadAbortException erhalte, führte dazu, dass ich versuchte, ihn durch ApplicationInstance.CompleteRequest () zu ersetzen. Wenn ich das mache, bekomme ich die ThreadAbortException nicht mehr, aber dies unterbricht die zuvor funktionierende Benutzersteuerung - anstelle der resultierenden Excel-Tabelle, die die Daten aus dem Raster enthält, enthält sie den HTML-Code der enthaltenen Seite, und auf jeden Fall ist es leicht genug, ihn zu unterdrücken dieser Fehler mit einem leeren Fang. Der direkte Aufruf mit dem dynamisch generierten GridView wird jedoch nicht behoben. Dieser Code gibt einen Javascript-Fehler aus: "Die vom Server empfangene Nachricht konnte nicht analysiert werden."

Ich würde gerne verstehen, was genau hier vor sich geht, aber ich bin gerade dabei, Ergebnisse zu benötigen, unabhängig vom Verständnis. Alle anderen Ansätze, die ich ausprobiert habe (Datagrid anstelle von GridView usw.), haben dieselben Probleme und sind im Wesentlichen dieselben, wenn es um das "Übernehmen" geht. die aktuelle Antwort und die Verwendung von Stringwriter und HTMLwriter, um die Daten in eine Antwort mit Excel ContentType zu rendern. Und da dies nachweislich im Kontext einer Benutzersteuerung funktioniert, bin ich mir nicht sicher, warum es nicht funktioniert, wenn es direkt aufgerufen wird ...

War es hilfreich?

Lösung 3

Das Problem hatte eigentlich nichts mit dem Excel-Export zu tun.Der Fehler „… konnte nicht analysiert werden“ war der Schlüssel.Über diese Links erhielt ich den Schlüssel, dass die Grid-Ereignisse nur ein teilweises Postback-Ereignis verursachen:

http://forums.asp.net/t/1392827.aspx

http://forums.aspfree.com/net-development-11/gridview-footer-template-button-in-updatepanel-not-posting-back-236087.html

Dies erklärt die ThreadAbortException und den Fehler "... konnte nicht analysiert werden".Das Hinzufügen zum OnPreRender des ImageButton war die Lösung:

protected void addTrigger_PreRender(object sender, EventArgs e)
{
    if (sender is ImageButton)
    {
        ImageButton imgBtn = (ImageButton)sender;
        ScriptManager ScriptMgr = (ScriptManager)this.FindControl("ScriptManager1");
        ScriptMgr.RegisterPostBackControl(ImgBtn);
    }
}

Andere Tipps

Versuchen Sie stattdessen: HttpApplication.CompleteRequest () gemäß: http://www.c6software.com/codesolutions/dotnet/threadabortexception.aspx

Sie diskutieren das zusätzliche HTML, das geflasht wird

benutze dies

   Response.Clear()
    Response.AddHeader("content-disposition", atchment;filename=fm_specification.xls")
    Response.Charset = ""
    Response.Cache.SetCacheability(HttpCacheability.NoCache)
    Response.ContentType = "application/vnd.xls"
    Dim stringWrite As System.IO.StringWriter = New System.IO.StringWriter
    Dim htmlwrite As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(stringWrite)
    GridView1.RenderControl(htmlwrite)
    Response.Write(stringWrite.ToString)
    Response.End()

anstelle von gridview1 können Sie div verwenden

                            dont forget to add this on your page

 Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
 End Sub

Das Ereignis, bei dem der Export in Excel-Code aufgerufen wird, muss ein vollständiges Postback durchführen.Das Problem ist, dass es nur ein teilweises Postback gibt.

Ich hatte den gleichen Fehler und er wurde behoben, als ich ein vollständiges Postback machte.

Hoffe, das hilft jemandem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top