Question

J'ai un problème avec la conversion en code Excel que je trouve. Je travaille sur un projet de site Web dans .NET 4.0, et j'ai créé une classe pour cela qui fait ce qui suit (basé surhttp://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();
  }
}

J'appelle cette classe à partir d'un UserControl qui contient un bouton qui est ajouté à un GridView affiché sur la page. Cela fonctionne comme prévu - cliquez sur le bouton, vous êtes présenté avec une option de téléchargement pour ouvrir ou enregistrer la feuille de calcul Excel résultante contenant les données de GridView.

Cependant, lorsque j'appelle cela à partir d'un linkbutton à l'intérieur d'un autre gridview, je voudrais créer un GridView dynamique pour contenir des données et l'exporter. Quand je fais cela, je reçois une threadAbortexception à partir de l'appel de réponse.end dans la classe.

Question 1: Pourquoi ne reçois-je pas cette threadabortexception lors de l'appel du même code à partir d'un UserControl? UserControls obtient-il leurs propres fils ou un autre type de contexte?

La recherche sur l'erreur que j'obtiens lorsque cette ThreadAbortexception se produit m'a amené à tenter de le remplacer par des applicationsInstance.CompteRequest (). Quand je fais cela, je n'obtiens plus la ThreadAbortexception, mais cela rompt le UserControl qui fonctionne précédemment - au lieu de la feuille de calcul Excel résultante contenant les données de la grille, elle contient le HTML de la page de contenu, et en tout cas, il est assez facile de supprimer cette erreur avec une prise vide. Cependant, il ne corrige pas l'appel direct avec le GridView généré dynamiquement, ce code rend une erreur JavaScript: "Le message reçu du serveur n'a pas pu être analysé."

J'aimerais comprendre ce qui se passe exactement ici, mais je suis sur le point d'avoir besoin de résultats, quelle que soit la compréhension. Toutes les autres approches que j'ai essayées (DataGrid au lieu de GridView, etc.) abordent les mêmes problèmes, et sont essentiellement les mêmes lorsqu'il s'agit de "prendre le contrôle" de la réponse actuelle et d'utiliser StringWriter et HTMLWriter pour rendre les données dans un Réponse avec Excel ContentType. Et puisque cela fonctionne manifestement dans le contexte d'un UserControl, je suis à la fin de mon esprit pour expliquer pourquoi cela ne fonctionnera pas lorsqu'il est appelé directement ...

Était-ce utile?

La solution 3

Le problème était en fait complètement sans rapport avec l'exportation Excel. L'erreur «… ne pouvait pas être analysée» était la clé. D'après ces liens, j'ai obtenu la clé, à savoir que les événements de la grille ne provoquent qu'un événement postal après:

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

Cela explique l'erreur ThreadAbortexception et «… ne pourraient pas être analysées». L'ajout de cela à l'onPrerender de l'imagebutton était la solution:

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);
    }
}

Autres conseils

Essayez à la place: httpapplication.comPleTeRquest () selon:http://www.c6software.com/codesolutions/dotnet/threadabortexception.aspx

Ils discutent du HTML supplémentaire

utilisez ceci

   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()

Au lieu de GridView1, vous pouvez utiliser div

                            dont forget to add this on your page

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

L'événement sur lequel est appelé le code d'exportation vers Excel, doit faire un post-dos complet. Le problème est parce qu'il ne fait qu'un post-dos partiel.

J'ai eu la même erreur et c'est résolu quand j'ai fait un post-dos complet.

J'espère que cela aide quelqu'un.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top