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 (anche 1 euro)
- Registrazione al sito con dati reali (opzionale)
Articoli che potrebbero interessarti:



#1 da Domenico il 23 settembre 2009
Interessante e utile
#2 da Salvatore il 1 gennaio 2010
Ottimo progetto
#3 da capoweb il 19 gennaio 2010
Puoi inviarmi il progetto di cui sopra? Grazie
#4 da nerimax il 11 marzo 2010
Sarei interessato al file del progetto. Grazie
#5 da cociredef il 19 marzo 2010
Sono interessato al file DGV2XLS.vb
come posso scaricarlo ? Grazie.
#6 da Giovanni Bernardo il 19 marzo 2010
Mi pare che c’è scritto
#7 da piero.guarino il 25 marzo 2010
Ciao ho letto l’articolo e mi sembra molto interessante, come posso fare per il download? (premetto che ho gia provveduto a fare una donazione). Se vi interessa l’id transazione posso fornirlo privatamente.
Grazie
Piero
#8 da Giovanni Bernardo il 25 marzo 2010
Tutto ok. Te l’ho inviato via email.
#9 da vito il 7 giugno 2010
Veramente molto interessante!
ho provveduto a fare la donazione!
#10 da Giovanni Bernardo il 8 giugno 2010
Grazie, te l’ho inviato.
#11 da vito il 8 giugno 2010
Io utilizzo visual studio 2005 e non riesco ad eseguire il programma!come mai?
#12 da Giovanni Bernardo il 8 giugno 2010
Non posso provare ad aiutarti se non ho informazioni. Io il progetto l’ho fatto con VB2008
#13 da vito il 8 giugno 2010
dice che il progetto è stato creato con una versione più recente del programma!
#14 da Giovanni Bernardo il 8 giugno 2010
Appunto… L’ho fatto col VB2008 e tu stai usando il 2005… Le versioni Express di visual studio sono gratuite, le puoi scaricare da qui:
http://www.microsoft.com/express/downloads/
E’ uscita la 2010, che personalmente non ho ancora provato, ma è possibile scaricare anche la 2008.
#15 da Giovanni Bernardo il 8 giugno 2010
Prima di installare VB2008 o 2010 fai quest’altra prova: non avviare il progetto che ti ho inviato ma creane tu uno nuovo, nel nuovo progetto includi soltanto il modulo DGV2XLS.vb come ho spiegato nell’articolo e vedi se te lo fa includere. Se si… è già pronto tutto… non ti resta che crearti una datagridview e metterci dei dati a caso, dopodichè richiami la funzione passandogli la tua datagridview come parametro.