VB.NET : Esportare una DataGridView in Excel, una comoda funzione DataGridView To Excel pronta all’uso!
Eccoci di nuovo qui alle prese con il pluriutilizzato controllo DataGridView, che è il controllo che preferisco per la visualizzazione dei dati provenienti da database. In questo articolo vedremo come esportare il contenuto di una datagridview su un foglio Excel.
Bisogna innanzitutto munirsi dei PIA (Primary Interoperativity Assemblies) per Office, e più precisamente per la versione di Office che intendiamo utilizzare. Tali componenti non sono nient’altro che librerie che permettono ai nostri software di interagire con i prodotti Microsoft Office (quindi non solo Excel). I PIA possono essere recuperati gratuitamente sul sito della Microsoft a questi indirizzi:
PIA per Office XP (2001/2002):
http://www.microsoft.com/downloads/details.aspx?familyid=C41BD61E-3060-4F71-A6B4-01FEBA508E52&displaylang=en
PIA per Office 2003:
http://www.microsoft.com/downloads/details.aspx?familyid=3c9a983a-ac14-4125-8ba0-d36d67e0f4ad&displaylang=en
PIA per Office 2007:
http://www.microsoft.com/downloads/details.aspx?familyid=59DAEBAA-BED4-4282-A28C-B864D8BFA513&displaylang=en
Dopo aver scaricato i PIA, installiamoli e avviamo un nuovo progetto Visual Basic. In tale progetto dovremo necessariamente includere il riferimento ai PIA con il classico sistema: Progetto -> Aggiungi Riferimento
Spostarsi quindi sulla scheda denominata “COM”, trovare e selezionare “Microsoft Excel xx.0 Object Library” (xx sarà sostituito dalla versione di Office/PIA che avete installato, nel mio caso, utilizzando Office 2003 la versione è 11). Dare quindi l’OK
Per il resto… il gioco è già fatto dal momento che in fondo all’articolo gli utenti registrati possono scaricare il modulo fatto da me che esegue già tutte le operazioni di esportazione di una DataGridView in Excel. E’ sufficiente, nella finestra “Esplora soluzioni”, cliccare con il tasto destro sul nome del progetto e selezionare: “Aggiungi -> Elemento esistente” e quindi caricare il modulo “DGV2XLS.vb”.
L’utilizzo del mio modulo è semplicissimo, in un punto qualsiasi del vostro programma (es.: click su un pulsante) è sufficiente richiamare la sub DGV2XLS che ha questa sintassi:
DGV2XLS(ByRef DGV As DataGridView, _ Optional ByVal PrintTitle As String = "", _ Optional ByVal AlternateRowsColor As Boolean = True, _ Optional ByVal GridAroundValues As Boolean = True) |
DGV è il nome della DataGridView da esportare, è l’unico parametro obbligatorio
PrintTitle è una stringa opzionale che andrà a costituire il titolo della stampa del foglio Excel
AlternateRowsColor è un valore booleano, di default impostato su True: colora le righe della tabella Excel in maniera alternata, impostatelo su False se volete che le righe rimangano tutte bianche.
GridAroundValues è un valore booleano, di default impostato su True: disegna la griglia intorno ai valori, impostatelo su False se non volete la griglia.
La sub reimposta anche la stampa facendo entrare tutta la larghezza della tabella in un unico foglio e blocca le intestazioni in maniera tale che siano sempre visibili anche scorrendo la tabella verso il basso (ovvero la funzione che da Excel si ottiene selezionando Finestra -> Blocca riquadri).
Per altre informazioni sul funzionamento basta spulciare il codice del modulo che ho cercato di commentare il più possibile per renderlo chiaro. Se avete già esperienza di programmazione in VBA vi renderete conto che le modalità di esecuzione delle operazioni sono pressochè identiche.
Il codice è sicuramente migliorabile, ad esempio non ho previsto una gestione errori: durante la creazione del foglio excel, se si verificano errori, il programma si blocca e rimarrà un’istanza di Excel aperta in memoria, invisibile, che andrà chiusa manualmente nel Task Manager. Oppure ancora: per DataGridView contenenti molti dati, le operazioni potrebbero durare parecchio, e in questo tempo l’utente potrebbe avere l’impressione che il programma si sia inchiodato, anche se in realtà sta lavorando, per cui a questo scopo sarebbe meglio visualizzare una finestra con una progressbar che indica l’andamento delle operazioni.
Quando si lavora con Excel bisogna sempre tenere conto di varie cose:
-
dopo aver installato i PIA e aggiunti come riferimento al progetto, ricordiamoci di importare lo spazio dei nomi per facilitarci le operazioni di scrittura del codice:
Imports Microsoft.Office.Interop
(se utilizzate soltanto la mia sub non è necessario, in quanto viene già incluso dal modulo)
-
Anche se è banale, è importante capire la struttura gerarchica di un foglio di lavoro: in cima c’è l’applicazione (Excel.Application) che rappresenta appunto l’istanza del programma Microsoft Excel, bisogna quindi aggiungere una cartella di lavoro (Excel.Workbook) (o caricarne una già esistente) che alla fine rappresenta il nostro file excel (.xls). La cartella di lavoro a sua volta è costituita da vari fogli o schede (Excel.Worksheet), ogni scheda ha le sue proprietà e oggetti, tra cui le celle ( Cells(Riga,Colonna) )
-
Gli indici di Excel sono 1-based index, il che vuol dire che il primo elemento di una collezione avrà indice 1 e non zero come siamo abituati a pensare (quindi la prima cella di un foglio di lavoro -A1 per intenderci- sarà Cells(1,1) e non Cells(0,0)!), per cui durante le operazioni con i cicli ecc dobbiamo fare attenzione a questa caratteristica.
-
Se non sapete in Excel come si esegue (via codice VB) una determinata operazione (per dirne una: come si cambia il colore di sfondo di una cella), potete benissimo utilizzare il metodo che uso io: da Excel si registra una macro (Strumenti -> Macro -> Registra nuova macro), si eseguono le operazioni delle quali vogliamo sapere le istruzioni, si stoppa la registrazione della macro e infine se ne visualizza il codice (Strumenti -> Macro -> Visual basic editor) e si prende quindi spunto da la (ovviamente mettendoci molto mano, dal momento che il codice creato in automatico da Excel è davvero molto sporco). Con questo sistema sono riuscito a fare cose più complesse di questa semplice esportazione, come la creazione di grafici a runtime, senza la necessità di comprare manuali o leggere guide. Provateci pure voi: basta un po di fantasia e inventiva e trarrete sicuramente soddisfazione dall’aver imparato una cosa apparentemente complessa da soli!
Ultima nota: è ovvio che una eventuale distribuzione del progetto facente uso dei PIA deve anche includere l’installazione di questi assemblies.
Se utilizzate questa funzione in un vostro progetto, se la migliorate, sentitevi liberi di contattarmi o di lasciare un commento. Ricordo che tale progetto, come d’altronde tutti gli altri presenti su questo sito, non è utilizzabile a fini commerciali.
Nel download c’è il modulo da utilizzare nei vostri progetti (DGV2XLS.vb) e un progettino di esempio per capire come va utilizzata la funzione.
Il progetto è stato realizzato con Visual Basic 2008 per cui non assicuro che possa funzionare con versioni di Visual Studio precedenti o successive.
Download: NON DISPONIBILE
A causa del comportamento scorretto e ignobile di alcune persone, che si registrano utilizzando servizi email usa e getta, fornendo credenziali false allo scopo di utilizzare tale progetto a scopi commerciali e contravvenendo a quanto esposto nel disclaimer, tale download è stato rimosso, chi ne avesse bisogno può richiedermelo previa:
- Donazione a piacere (a partire da 2 euro)
- Registrazione al sito con dati reali (opzionale)