lunedì 30 aprile 2007

Nuovo Indirizzo del blog

Salve a tutti, mi scuso per il ritardo con il quale pubblico questo annuncio. Vi informo che da ormai quasi un mese questo blog è stato trasferito a questo indirizzo:

http://simovb.wordpress.com

venerdì 16 marzo 2007

Scrivere Files Excel con ADO.NET

Nel precedente post abbiamo parlato di come sia possibile intendere un file Excel come un database composto da tante tabelle rappresentate dai singoli fogli di lavoro. Abbiamo poi visto come utilizzare ADO.NET per accedere al contenuto del file proprio come se stessimo lavorando con un database tradizionale e quindi semplificandoci notevolmente il lavoro.

Oggi vorrei affrontare il discorso di come popolare un file Excel attraverso ADO.NET e la sintassi SQL. Lo script è molto simile a quello del post precedente con la scontata differenza che in questo caso, andiamo ad inserire dei dati nel foglio, invece che leggerli.


Private Sub WriteExcelFile(ByVal FilePath As String)
Dim oledbConn As OleDb.OleDbConnection
Dim oleCmd As OleDb.OleDbCommand
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

For i As Integer = 0 To 10
oleCmd.CommandText = "INSERT INTO [Foglio1$] (ColonnaA, ColonnaB, ColonnaC) VALUES " & _
"('Riga " & i & " Colonna A', 'Riga " & i & " Colonna B', 'Riga " & i & " Colonna C')"
oleCmd.ExecuteNonQuery()
Next

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


Questa semplice funzione prende un file Excel, si posiziona sul Foglio1 e scrive 10 righe di prova. Ogni volta che la funzione viene lanciata vengono accodate 10 righe al file proprio come se stessimo ragionando con una normale tabella di un qualsiasi database.

A questo punto è evidente che possiamo usare la normale sintassi SQL per lavorare sui dati con operazioni tipo UPDATE O DELETE.

Per poter funzionare, questa routine ha bisogno di un file Excel preparato ad hoc che contenga al suo interno un Foglio di Lavoro chiamato Foglio1, e che nella prima riga contenga tre colonne chiamate: ColonnaA, ColonnaB e ColonnaC. Come nell'esempio precedente infatti, la proprietà HDR=YES della stringa di connessione indica al JET di utilizzare le informazioni della prima riga del foglio come intestazioni di colonna.

I vantaggi di questo approccio ai file Excel sono l'estrema facilità di utilizzazione, la comodità nella gestione dei dati e la completa indipendenza dall'applicazione. Questo sistema ha però sicuramente degli svantaggi tra i quali, secondo me spiccano: la necessità di avere un file di modello sul quale lavorare, l'impossibilità di applicare formattazione personalizzata al foglio, il limite di poter gestire solo strutture di dati tabellari.

Uno scenario in cui potrebbe trovare piena applicazione un approccio del genere ai file Excel è quello della produzione di files di interscambio tra due o più applicazioni. Ho visto usare questo sistema in alcune occasioni e devo dire che funziona, ma a mio avviso esistono soluzioni migliori (tipo file dbf o meglio xml) perchè ricordo che il limite di dati per ogni singolo foglio in Excel è di 65536 righe e in diversi ambiti queste potrebbero non essere sufficienti.