VB.NET: Esportare un database Access su un foglio Excel

In questo post faccio un esempio di come esportare i dati contenuti in un database Access su un foglio di calcolo Excel da una applicazione realizzata in Visual Basic.NET
Immaginiamo quindi di avere nella nostra applicazione un pulsante la cui routine di gestione dell’evento click deve andare a leggere i dati dal database e crearci un foglio di lavoro di Excel contenente gli stessi dati possibilmente formattati in un modo decente. In questo esempio (come in altri precedenti) abbiamo una tabella contenente informazioni su cd musicali (artista, titolo, ecc).
Update: mi son dimenticato una cosa importante. Ovviamente per poter utilizzare gli oggetti della libreria dei componenti Excel bisogna aggiungere il riferimento ad essa nel progetto. Per fare questo nel men?? si va su Progetto -> Aggiungi Riferimento, nella finestra che si apre si seleziona il tab COM e si cerca la voce Microsoft Excel 10.0 Object Library , si clicca su Seleziona e poi Ok. Fine update.
Da qualche parte nel programma avremo quindi tutte le dichiarazioni degli oggetti necessari per operare sul database, localizzarlo, connetterlo, interrogarlo. Per maggiori informazioni al riguardo rimando a questi 2 post scritti in precedenza:

Dicevamo:

Public PercorsoDB As String = "C:\Documents and Settings\prova\Documenti\Visual Studio Projects\Database\db2.mdb"

'Stringa di Connessione
Public ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & PercorsoDB

Public Cn As New OleDbConnection(ConnString)
Public dr As OleDbDataReader
Public cmd As OleDbCommand
Public sql As String

Ora vediamo in dettaglio la routine di gestione dell’evento click sul pulsante per esportare i dati:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Cn.Open() 'apro la connessione al database
sql = "SELECT artista,titolo,genere,anno,commenti FROM album ORDER BY artista" 'query
cmd = New OleDbCommand(sql, Cn)
dr = cmd.ExecuteReader

Dim i As Integer = 2
Dim f As Integer

'Dichiaro un oggetto di tipo applicazione Excel
Dim ExcelAppl As Excel.Application

'Dichiaro un oggetto di tipo cartella di lavoro di Excel
Dim ExcelBook As Excel.Workbook

'Dichiaro un oggetto di tipo foglio di calcolo Excel(una cartella ?® composta da pi?? fogli)
Dim ExcelSheet As Excel.Worksheet

'istanzio l'oggetto Applicazione Excel
ExcelAppl = CreateObject("Excel.Application")

ExcelAppl.Visible = True 'per rendere o meno visibile la finestra Excel

Impostando ExcelAppl.Visible = True si indica che si vuole aprire e rendere visibile all’utente l’istanza dell’applicazione Excel eseguita. Cio?® l’utente si vede aprire la finestra di Excel allo stesso modo di come se avesse lanciato direttamente il programma Excel o aperto un documento di questo formato. Se lo si imposta a “false” non si ha l’apertura della finestra di Excel ma il lavoro viene fatto diciamo in background e alla fine della routine ci si ritrova il documento Excel creato.


'aggiungo una cartella excel all'applicazione
ExcelBook = ExcelAppl.Workbooks.Add

'Mi posiziono sul foglio attivo, il primo (una cartella di base ne ha 3)
ExcelSheet = ExcelBook.ActiveSheet

'e gli do un nome
ExcelSheet.Name = "Album (CD)"

'indico che i caratteri della prima riga, essendo i nome delle colonne,
'cio?® i nomi dei campi del database, devono essere in grassetto
ExcelSheet.Rows.Item(1).font.bold = True

'Assegno un colore di sfondo alle celle che contengono i nomi dei campi del database
ExcelSheet.Range("A1:E1").Interior.Color = RGB(97, 186, 239)

'seleziono il range delle prime 5 (come i campi del database) celle della prima riga
'e gli imposto un bordo spesso intorno
ExcelSheet.Range("A1:E1").BorderAround(, Excel.XlBorderWeight.xlThick)

'imposto allo stesso range i bordi verticali tra le celle un po' pi?? sottili
ExcelSheet.Range("A1:E1").Borders(Excel.XlBordersIndex.xlInsideVertical).Weight = Excel.XlBorderWeight.xlMedium

'assegno al range dei nomi delle colonne un allineamento centrale del testo
ExcelSheet.Range("A1:E1").HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter

'allineo centralmente anche tutti i valori della colonna 4 che ?® il valore numerico
'che indica l'anno di pubblicazione del disco
ExcelSheet.Columns.Item(4).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter

'imposto la grandezza del carattere
ExcelSheet.Columns.Font.Size = 11

'inserisco gli effettivi valori nelle celle dei nomi delle colonne
ExcelSheet.Cells(1, 1).value = "Artista"
ExcelSheet.Cells(1, 2).value = "Titolo"
ExcelSheet.Cells(1, 3).value = "Genere"
ExcelSheet.Cells(1, 4).value = "Anno"
ExcelSheet.Cells(1, 5).value = "Commenti"

'ciclo che legge i valori dei record e li inserisce nel foglio
'formattando opportunamente i bordi delle celle
Do While dr.Read()
ExcelSheet.Range(ExcelSheet.Cells(i, 1), ExcelSheet.Cells(i, dr.FieldCount)).Borders(Excel.XlBordersIndex.xlInsideVertical).Weight = Excel.XlBorderWeight.xlMedium

ExcelSheet.Range(ExcelSheet.Cells(i, 1), ExcelSheet.Cells(i, dr.FieldCount)).Borders(Excel.XlBordersIndex.xlEdgeLeft).Weight = Excel.XlBorderWeight.xlThick

ExcelSheet.Range(ExcelSheet.Cells(i, 1), ExcelSheet.Cells(i, dr.FieldCount)).Borders(Excel.XlBordersIndex.xlEdgeRight).Weight = Excel.XlBorderWeight.xlThick

ExcelSheet.Range(ExcelSheet.Cells(i, 1), ExcelSheet.Cells(i, dr.FieldCount)).Borders(Excel.XlBordersIndex.xlEdgeBottom).Weight = Excel.XlBorderWeight.xlThin

'ciclo che inserisce gli effettivi valori dei campi dei record
For f = 1 To dr.FieldCount
ExcelSheet.Cells(i, f).value = dr(f - 1)
Next
i += 1
Loop

'imposto il bordo inferiore spesso alle celle dell'ultima riga
ExcelSheet.Range(ExcelSheet.Cells(i - 1, 1), ExcelSheet.Cells(i - 1, 5)).Borders(Excel.XlBordersIndex.xlEdgeBottom).Weight = Excel.XlBorderWeight.xlThick

'imposta la larghezza dell'intera colonna in base a quella della cella con larghezza maggiore
ExcelSheet.Columns.AutoFit()

'salvo il documento excel
ExcelAppl.ActiveWorkbook.SaveAs(Environment.CurrentDirectory & "\album.xls", , , , , , Excel.XlSaveAsAccessMode.xlExclusive)

Cn.Close() 'chiudo la connessione al database

End Sub

Siccome il codice pu?? risultare un po’ incasinato a causa dell’eccessiva lunghezza di alcune istruzioni linko anche la versione .txt del documento dove le righe di codice risultano sicuramente pi?? chiare.

Le 2 immagini riportate qui di seguito mostrano quello che ?® il risultato ottenuto:

foglio Excel con i dati esportati
Foglio di calcolo Excel col risultato ottenuto

anteprima di stampa
Anteprima di stampa del risultato ottenuto

This entry was posted in $1$s. Bookmark the permalink.

One thought on “VB.NET: Esportare un database Access su un foglio Excel

Leave a Reply

Your email address will not be published. Required fields are marked *