Venerdi 9 Dicembre 2005 - Davis Molinari +-----------------------------------------------------------+ | 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. Da qualche parte nel programma avremo quindi tutte le dichiarazioni degli oggetti necessari per operare sul database, localizzarlo, connetterlo, interrogarlo, ecc.. (per maggiori informazioni al riguardo rimando a questi 2 post scritti in precedenza:) Public PercorsoDB As String = "C:\Documents and Settings\dede\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