Excel e VB.Net… sempre la solita storia

La salute adesso va bene, ringrazio quanti mi sono stati vicini e mi hanno dato forza. Quale miglior modo di ritornare all’opera se non quello di parlare, nella mia solita maniera (il lupo perde il pelo ma non il vizio) di un problema che ciclicamente si ripropone nei forum:

Come faccio a leggere/scrivere dati da e verso Excel?

Avevo già affrontato il problema (mio malgrado) nella mia attività lavorativa una prima volta nell’anno 2000 ed una seconda nel 2004, e poi successivamente ogni qual volta scrivo un programma nuovo. E questo perché, volente o nolente, qualsiasi utente PC che abbia poco più dell’intelligenza di una scimmia, impara, nell’ordine: Ad accendere il PC, a navigare su internet, a trovare i siti porno, ad usare LibroFaccia e la email, poi il Word e l’Excel.

Mi ricordo il mio Ex Amministratore di condominio che in Excel redigeva anche i verbali delle assemblee di condominio (il che è tutto detto).

Con questi presupposti ogni qual volta si tratta di avere una qualche tabella di dati, questa sicuramente si troverà in un foglio di Excel.

Come fare per scambiare i dati con Excel?

Di metodi fondamentalmente ne esistono 4:

  1. Usare un formato di interscambio tipo un cvs
  2. Usare OleDB/jet
  3. Usare le Api di office (come illustrato in una decina di articoli, tra i quali l’ottimo articolo di Diego qui).
  4. Usare un componente di terze parti che faccia quanto serve.

Il primo metodo richiede una qualche interazione da parte dell’utente, che normalmente preferisco evitare, e non consente di fare troppe cose.

Il secondo non consente un accesso pieno e totale al foglio, nel senso che non puoi formattare le celle, usare le formule etc.

Il terzo prevede che sul PC target ci siano le Api di Office installato, ed inoltre non è particolarmente veloce (provate a leggere o scrivere un file con 20.000 righe e poi mi dite).

Il quarto, a patto di scegliere la libreria giusta, è veloce, non ha dipendenze esterne (neanche richiede l’Office o l’Excel installato), ma richiede di dover aprire il portafogli e di dover pagare la libreria.

Fermo restando che ognuno è libero di usare il metodo che più gli aggrada, raccomando sempre di effettuare un’analisi costi/benefici e di non precludere a priori nessuna scelta.

Ad esempio, mi permetto di dare due suggerimenti su librerie commerciali che ho provato ed usato personalmente (prima una e poi l’altra) e che sono la GemBox.SpreadSheet Free di GemBox  e la FlexCelNet di TMS Software. Sicuramente ne esisteranno di migliori, se qualcuno ne conosce, me le segnali, sarò lieto di provarle.

Partiamo dalla Spreadsheet Free: udite udite… Limitata, GRATUITA e RIDISTRIBUIBILE anche in pacchetti commerciali a patto di linkare il sito della GemBox nel programma stesso.

Le limitazioni: 150 righe e 5 workSheet (fogli) nello stesso workbook. Direi che sono ACCETTABILI per un componente free, e nel tempo uno potrebbe scoprire che questa libreria va bene per il 99% dei casi.

Ovviamente io ho splafonato questo limite al secondo lavoro, quando ho dovuto elaborare un file di esportazione di un allevamento che vendeva sperma di coniglio a terzi che doveva essere spedito alla regione Piemonte (che tocca fa’ per campà).

Ho approfondito la ricerca ed ho trovato a 125 euro il componente di TMS Software del quale, nella licenza, ti danno anche i sorgenti. Il Gembox costa parecchio di più.

125 euro sono soldi, sempre meglio in tasca a me che in tasca a qualcun altro, ma quante ore fanno risparmiare?

Parecchie ed in due momenti.

Il primo è quando programmi, perché hai una programmazione MOLTO semplificata e pochi limiti.

Il secondo è quando installi: ZERO prerequisiti, metti il file nelle references e quando fai il deploy il gioco è fatto.

125 euro diviso per 10 euro l’ora (all’incirca come una donna delle pulizie) fanno 12,5 ore. Anche solo una ricerca su Google rischia di costarti di più (chiaro che parlo da uno che, in qualche maniera ha un ritorno economico dalla programmazione… se uno lo fa per hobby, allora anche 10 euro sono troppi).

Ma è effettivamente così facile e veloce da usare?

Proviamo:

Supponiamo di dover creare un file e di aggiungere un paio di dati:

Dim Xls As ExcelFile = New XlsFile(True)
Xls.NewFile(1) ' Qui creo il file, ma potrei aprirlo con Xls.Open
'impostiamo qualche valore
Xls.SetCellValue(1, 1, "Ciao VB")
Xls.SetCellValue(2, 1, 3)
Xls.SetCellValue(3, 1, 2.1)
'Impostiamo anche una formula
Xls.SetCellValue(4, 1, New TFormula("=Sum(A2,A3)"))
Xls.Save(NomeFile)

Semplice, vero? Ma supponiamo di voler fare qualcosa di più, che so… cambiare il colore ed il font delle celle:

Dim f As TFlxFormat= Xls.GetDefaultFormat
f.Font.Name="Times New Roman"
f.Font.Color= Color.Red

Creiamo un nuovo formato per le celle, quindi lo applichiamo alle celle interessate:

eDim XF As Integer= Xls.AddFormat(f)
Xls.SetCellFormat(2, 1, XF)
Xls.SetCellFormat(3, 1, XF)
Ok, sono solo quattro sciocchezze, ma provate a farle con i metodi da 1 a 3, e poi mi dite SE ci riuscite (i primi due) o con quanto lavoro ci riuscite (terzo metodo).
La lettura di dati da un file? Niente di più semplice…
Basta aprire il file on XLS.Open e leggere i dati con XLS.GetCellValue.
Veniamo ad un problema un minimo più pratico e così magari capirete perché questa libreria mi piace così tanto:
Supponiamo di dover creare un file fatto in una certa maniera, ad esempio 10 colonne magari colorate e con una certa intestazione, un’immagine e quant’altro. 
Come fare questa cosa complicata? Due modi possibili. Partire da un template e copiarlo ogni volta, oppure crearlo da programma. Ma vuoi mettere che Pa… aehm, che lavoro infame?
Esiste una utility, che si chiama APIMate che, dato un certo file Excel in ingresso, ti scrive il codice (VB, C#, Delphi) per ricrearlo uguale uguale!
Questo giusto per far capire come effettivamente sia facile, semplice e veloce fare le cose.
Con questo spero di aver dato qualche spunto di riflessione a quanti si scontrano o si scontreranno con questo problema.
Alla prossima

posted @ giovedì 20 settembre 2012 14:20

Print

Comments on this entry:

# re: Excel e VB.Net… sempre la solita storia

Left by Marco at 16/03/2013 12:48
Gravatar
Ciao,
complimenti per l'articolo!
La parte iniziale mi ha fatto morir dal ridere :D

Ciao Marco
vekwilson86@hotmail.it

# re: Excel e VB.Net… sempre la solita storia

Left by Pier at 23/04/2013 17:21
Gravatar
Bell'articolo! Io programmo quasi per diletto (basic, liberty basic, un poco VBA) e mi capita di dover interfacciarmi con Excel. Mi piacerebbe molto semplificare il tutto con una dll di terze parti che indichi. Ho scaricato Gembox e Visual Studio Express, genero una Console Application, aggiungo (con Imports) il riferimento alla Gembox, incollo il tuo primo codice ma ho una serie di errori (es Xlsfile non definito etc.). Mi viene il dubbio che il codice faccia riferimento alla FlexCelNet. E' così o dove sbaglio?
Grazie in anticipo
Pier

Your comment:



 (will not be displayed)


 
 
 
Please add 8 and 2 and type the answer here:
 

Live Comment Preview: