lunedì, aprile 07, 2008

Importazione di File excel, scoprire la struttura e i nomi dei fogli

Per accedere al contenuto dei file Microsoft Excel ci si può molto semplicemente appoggiare all'oggetto data.OledDbConnection

Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;" &
"Data Source=c:\fileexcel.xls; Extended Properties=Excel
8.0;"
'Connect to the file source
Dim conn As New
System.Data.OleDb.OleDbConnection(strConn)


E per leggere il contenuto:


Dim myData As New Data.OleDb.OleDbDataAdapter("SELECT * FROM [foglio1$]",
strConn)
myData.Fill(myDataset)


E se ora volessimo visualizzare il contenuto in un gridview:

GridView1.DataSource = myDataset.Tables(0).DefaultView
GridView1.DataBind()

Il vero problema è che non sempre si conosce la struttura esatta del file excel, soprattutto quanti fogli (worksheet) ci sono e il loro nome, importante per poter effettuare la SELECT dei dati.
Un approccio potrebbe essere quello di utilizzare gli oggetti .Net per accedere al framework COM di office, soluzione svantaggiosa, obbligherebbe ad avere Office installato sulla macchina, e se si tratta di un web server, potrebbe essere un serio problema.
Approccio più efficace è l'uso delle potenzialità di analisi della struttura di database della OledDBConnection, attraverso il metodo GetOleDbSchemaTable.
In particolare dopo aver aperto la connessione al file excel:

Dim SchemaTable As Data.DataTable
conn.Open()
SchemaTable = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, New
Object() {Nothing, Nothing, Nothing, Nothing})
conn.Close()

e quindi analizzando lo schema:

Dim fogli As New Generic.List(Of String)
For Each row As DataRow In SchemaTable.Rows
    If row!TABLE_TYPE.ToString = "TABLE" Then
        fogli.Add(row!TABLE_NAME.ToString())
    End If
Next

Ecco ottenuto l'elenco dei fogli.

Per approfondire sull'argomento, consiglio: How To Retrieve Schema Information by Using GetOleDbSchemaTable and Visual Basic .NET http://support.microsoft.com/kb/309488/en-us


#