sabato 10 marzo 2007

Leggere Files Excel con ADO.NET

Una richiesta frequente sui forum di programmazione riguarda come poter leggere o scrivere su file excel. A mio avviso il modo più semplice e comodo è quello di pensare i fogli excel esattamente come tabelle di un database e trattarli di conseguenza.

Un file Excel contiene al suo interno n fogli ed ogni singolo foglio può essere visto come una tabella a se stante. Con ADO.NET e OLEDB (ma lo stesso risultato si poteva ottenere anche con ADO classico) è possibile collegarsi ad un file, leggerne il contenuto e memorizzarlo in un DataSet esattamente allo stesso modo con cui si interroga un db SQL o di qualsiasi altro tipo.

Lo script qui sotto apre un qualsiasi file Excel, legge tutto il contenuto del Foglio1 e lo visualizza in una gridview [myGridView].


Private Sub ReadExcelFile(ByVal FilePath As String)
Dim oledbConn As OleDb.OleDbConnection
Dim oleCmd As OleDb.OleDbCommand
Dim oleDR As OleDb.OleDbDataAdapter
Dim myData As Data.DataSet
myData = New Data.DataSet

oledbConn = New OleDb.OleDbConnection
oledbConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
FilePath & ";Extended Properties = ""Excel 8.0;HDR=YES;"""
oledbConn.Open()

oleCmd = New OleDb.OleDbCommand
oleCmd.Connection = oledbConn

oleCmd.CommandText = "SELECT * FROM [Foglio1$]"

oleDR = New OleDb.OleDbDataAdapter(oleCmd)
oleDR.Fill(myData, "Tab")

myGridView.DataSource = myData.Tables("Tab")

myData.Dispose()
myData = Nothing
oleDR.Dispose()
oleDR = Nothing
oleCmd.Dispose()
oleCmd = Nothing
oledbConn.Dispose()
oledbConn = Nothing
End Sub



Il Foglio1 deve esistere nel file e deve chiamarsi esattamente così altrimenti la procedura va in errore.

Il fatto che nella connectionstring sia specificata la proprietà HDR=YES indica ad ADO di utilizzare la prima riga del foglio per le intestazioni di colonna. Di conseguenza le colonne della GridView prenderanno come etichetta i valori di colonna della prima riga, mentre i dati visualizzati cominceranno dalla seconda riga del foglio. La cosa interessante è che questa proprietà (influenzando direttamente il dataset) consente di accedere programmaticamente alle colonne del foglio, specificandone il nome. (Per esempio: myData.Tables("Tab").Rows(0).Item("Codice")).

Il fatto di poter leggere i file Excel con ADO permette di stabilire un criterio unico di accesso ai dati rendendo la vita del programmatore decisamente più semplice.

Nel prossimo post vedremo come scrivere dati su Excel sempre attraverso ADO

Nessun commento: