L’ esportazione di una GridView in Excel è una operazione molto comune, richiesta nella maggior parte delle applicazioni intranet. Le tecniche di esportazione di una GridView in Excel sono molte e diverse e la scelta è fortemente dipendente dallo scenario di applicazione. In questo articolo verrà mostrata qualche tecnica che può tornare utile in diverse occasioni.
Questo articolo è la libera traduzione di un articolo del mitico Mohammed Azam. Cominciamo con un esempio di esportazione di base. Innanzitutto è necessario popolare il GridView con dei dati. In figura è mostrata la tabella di esempio dalla quale reperiremo i dati:
La prossima operazione è popolare il GridView con i dati dal database. Il codice seguente utilizza un Dataset per popolare una ipotetica GridView il cui ID è gvUsers:
Dunque, ora il GridView è stato popolato con i dati. La prossima operazione è l’esportazione in Excel. Il seguente codice va associato all’ evento click del pulsante Export:
Sarà anche necessario effettuare l’ overload del metodo VerifyRenderingInServerForm in questo modo:
Quando viene premuto il pulsante di esportazione apparirà una finestra di dialogo che permetterà di aprire o salvare il file esportato. Selezionare l’ opzione Apri per vedere i dati esportati in un foglio di calcolo Excel come mostrato nell’ immagine di esempio:Applicare uno stileQualcuno avrà notato un problema nell’ esportazione dei dati, infatti gli zeri che precedono un numero vengono troncati. Questo significa che se un ipotetico identificativo 000345 verrà esportato come 345. Il problema può essere risolto applicando delle regole di stile allo stream in output. Naturalmente la colonna ID per essere rappresentata correttamente deve essere di tipo testo. Il formato di testo in Excel è rappresentato come “mso-number-format:\@”. Conosciuto il formato è possibile accodare lo stile allo stream di output:
Come si può evincere dal codice è stata utilizzata una variabile string per ottenere la regola di stile da applicare, ed è stato utilizzato il metodo Response.Write per accodare lo stile allo stream di output, l’ ultima cosa che rimane da fare è applicare lo stile alla colonna desiderata; questo può essere fatto nell’ evento RowDataBound della GridView:
Ora l’ identificativo verrà visualizzato correttamente
E’ possibile trovare lo stile corretto per la colonna del GridView aprendo il file Excel esportato, è sufficiente cliccare sull’ header della colonna prescelta e selezionare “Format Cells”. Verranno presentate numerose opzioni per la formattazione, è necessario selezionare Text dalla lista e salvare il file in formato .html. Ora basterà aprire il documento html con un browser per vedere il sorgente. Nella sezione degli stili saranno visibili numerosi stili per le le celle della tabella (td). E’ necessario localizzare una cella della colonna desiderata e verrà individuata una cella simile a questa:
<td class=”xl27″ width=”35″ style=”border-left:none; width:”26pt”;>ID</td>
Và ricercata la classe di stile associata:
Nell’ eventualità che il GridView contenga LinkButton o che fosse abilitato il Paging riceveremmo però questo errore:
Per ovviare a questo problema è innanzitutto necessario disabilitare la validazione degli eventi:
Dopodichè il file esportato avrà un aspetto simile:
Come si evince dall’ immagine anche le DropDownList e i LinkButton vengono esportati con il controllo GridView. Sebbene l’ opzione selezionata nelle DropDownList sia corretto, non è il risultato che vogliamo ottenere, scriviamo dunque un metodo che sostituisca tutti i LinkButton e le DropDownList con dei controlli Literal:
}
}
}
L’ idea è molto semplice, si tratta solamente di sostituire tutti i LinkButton e le DropDownList con dei controlli Literal e assegnare alla proprietà Text il contenuto o la selezione del controllo sostituito. Questa operazione deve essere fatta prima dell’ esportazione del GridView:
Ora il file Excell si mostrerà così:







Lavorando in vb non riesco a capire dove inserire il metodo
public override void VerifyRenderingInServerForm(Control control){}
potresti inviarmi il codice in vb per gestire una esportazione
ti ringrazio
ciao
lodovico
Ciao, il metodo esegue l’override del metodo Page.VerifyRenderingInServerForm per generare un’eccezione se in fase di esecuzione il controllo non è contenuto in un controllo Form, eseguire questo override, e lasciandolo vuoto(quindi senza richiamare il metodo base), aggira questo controllo. Devi porre il codice nel code behind esattamente come per il resto del codice
Partial Class _Default
Inherits System.Web.UI.Page
Public Overrides Sub VerifyRenderingInServerForm(ByVal control As System.Web.UI.Control)
End Sub
End Class
Se ti server il codice completo contattami per email, ciao.
ciao senti riesco ad esportare ma ogni vola prima di aprire excel mi da un errore che mi dice che deve interpretare poi lo fa ma al mio cliente non va bene come faccio a farglielo saltare? domanda 2: come faccio a scrivere su più sheet( fogli )?
L’esempio presentato e’ a solo scopo indicativo e tu non dai molti indizi sulla natura dell’errore, ne’ sulla versione di Excel, dovrei ricostruire lo scenario codice alla mano(e tempo permettendo). Sulla seconda domanda non ho suggerimenti. Ciao