Antonio "tdj"

(C'è sempre un modo migliore)
posts - 312, comments - 268, trackbacks - 17

My Links

News





Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

Articoli

Blogs

Controlli WinForm free

Guide

Siti vari

Sviluppo

Esportare il contenuto di un GridView in Excel

Esportare il contenuto di una griglia asp.net in Excel è piuttosto semplice. Basta renderizzare il contenuto della griglia nell'oggetto Response della pagina con il content type opportunamente impostato:

   1:  Response.Clear()
   2:  Response.ContentType = "application/ms-excel"
   3:  Response.AddHeader("content-disposition", "inline;filename=test.xls")
   4:   
   5:  Dim sw As New StringWriter()
   6:  Dim htw As New HtmlTextWriter(sw)
   7:   
   8:  grdFiles.RenderControl(htw)
   9:   
  10:  Response.Write(sw.ToString)
  11:  Response.End()
  12:   
  13:  sw.Dispose()
  14:  htw.Dispose()


Questo codice funziona perfettamente con un controllo DataGrid ma non con una GridView. Infatti con quest'ultimo controllo viene sollevata questa eccezione:


gridvieweport_error

Che, onestamente, mi ha lasciato parecchio perplesso visto che la GridView era nel tag Form. Non capendo quale fosse la causa del problema ho iniziato a cercare in rete ed ho trovato una segnalazione fatta su Microsoft Connect. La soluzione data è stata quella di fare l'override del metodo VerifyRenderingInServerForm lasciandolo, però, vuoto:

   1:  Public Overrides Sub VerifyRenderingInServerForm(ByVal control As System.Web.UI.Control)
   2:   
   3:  End Sub

Con questa modifica, finalmente il contenuto della GridView viene visualizzato correttamente in Excel.

Ma non finisce qui... :)

E già perchè potrebbe verificarsi ancora un problema, ovvero una eccezione InvalidOperationExceptrion:


System.InvalidOperationException was unhandled by user code Message="RegisterForEventValidation can only be called during Render();" Source="System.Web" StackTrace: at System.Web.UI.ClientScriptManager.RegisterForEventValidation(String uniqueId, String argument) at System.Web.UI.ClientScriptManager.RegisterForEventValidation(PostBackOptions options) at System.Web.UI.ClientScriptManager.GetPostBackEventReference(PostBackOptions options, Boolean registerForEventValidation) at System.Web.UI.WebControls.LinkButton.AddAttributesToRender(HtmlTextWriter writer) at System.Web.UI.WebControls.WebControl.RenderBeginTag(HtmlTextWriter writer) at System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer)

Dallo stack si nota come il problema riguardi l'EventValidation della pagina che, di default, è true. Impostandolo a false tutto dovrebbe funzionare:


1:
<%@ Page Language="vb" AutoEventWireup="false" EnableEventValidation="false"
   2:      CodeBehind="Default.aspx.vb" 
   3:      Inherits="GridViewExport._Default" %>
 
 

Print | posted on sabato 28 luglio 2007 23:42 | Filed Under [ ASP.NET 2.0 Asp.net ]

Feedback

Gravatar

# re: Esportare il contenuto di un GridView in Excel

Prova http://www.gridviewtoexcel.com
Ti consente di fare non solo l'export in HTML che funziona solo se hai pochi dati, ma anche in vero vero formato XML per Excel 2003 o in formato xlsx per Excel 2007.

Ciao
12/12/2007 00:52 | Ettore
Gravatar

# re: Esportare il contenuto di un GridView in Excel

L'export fatto in questo modo è lento e non lo puoi controllare in nessn modo.

Se vuoi esportare il contenuto di un Gridview, o meglio dei dati che lo alimentano, in autentico formato Excel 2003 (XML) o Excel 2007 (xlsx) visita http://www.gridviewtoexcel.com.

Ciao
13/01/2008 12:56 | Ettore
Gravatar

# re: Esportare il contenuto di un GridView in Excel

Grazie sei un grande
11/06/2008 15:18 | Fabio Cirrito
Gravatar

# re: Esportare il contenuto di un GridView in Excel

ciao
utilizzo la tua strateggia per creare un foglio excel e va alla grande.

avrei bisogno di una piccola modifica:
vorrei far creare 2 volte lo stesso file excel
senza dover cliccare 2 volte il tasto "esporta in excel"
sembrava una modifica sciocca ma mi sta facendo impazzire

sai darmi una dritta? grazie
14/04/2009 15:04 | Nico
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET