C# e file .ODS

I dati nei fogli di calcolo

Scritto da Roberto Rossi il 18-07-2019

Spesso mi è capitato di sviluppare software scritti in C# in grado di leggere file provenienti da Microsoft Excel, i famosi .XLS e meglio ancora gli .XLSX. La lettura dei dati da questi file non ha quasi mai portato problemi. Esistono librerie open source per la loro lettura, librerie ufficiali Microsoft, librerie scritte da terzi, c'è solo l'imbarazzo della scelta.

In questo periodo però sto scrivendo un software che ha la necessità di leggere file creati con LibreOffice, in formato .ODS.

Qui le cose si fanno più complesse. Nonostante i file .ODS siano un formato aperto, libero, di librerie per .NET e per C# ce ne sono poche, troppo poche. Per me, una vera delusione.

Visto che nulla di quello che ho trovato mi ha soddisfatto, alla fine ho deciso di scrivere la mia libreria per la lettura dei file .ODS.

Ma andiamo con ordine.

OpenDocument, .ODS e C#, cosa esiste?

Esaminiamo ora la situazione legata al linguaggio C# e alla lettura dei file .ODS.

Le soluzioni/librerie gia pronte non sono molte.

Abbiamo la possibilità di leggere i file .ODS utilizzando LibreOffice e le sue API. Purtroppo cio significa che sul PC deve essere presente proprio LibreOffice. E' un limite? Alle volte si, alle volte no. In senso generale non la ritengo una cosa positiva, costringere qualcuno a installare un pacchetto del genere solo per consentire ad un'altro software la lettura dei file può trovare la contrarietà di molti (utilizzatori/clienti).

La seconda possibilità è quella di acquistare una libreria in grado di leggere i file .ODS. Ad esempio https://www.gemboxsoftware.com/ oppure https://www.aspose.com/. Nel caso in cui si sviluppino software commerciali, con un ritorno economico adeguato, non ci sarebbero problemi. Ma se il software che si sviluppa è Software Libero, magari senza un budget? Oppure se fosse software commerciale ma non fosse economicamente compatibile con i prezzi delle librerie?

Alla fine qui stiamo parlando della semplice lettura dei dati contenuti in un foglio di calcolo salvato in un file .ODS.

Naturalmente potremo affidarci a pezzi di codice trovati online che, a prima vista, permettono di leggere i nostri file .ODS. Un esempio è 3 oppure 4, ma in questo caso l'affidabilità della libreria/codice e la compatibilità con il formato .ODS sono cose tutte da verificare.

Dopo un po' di ricerche e un po' di prove la soluzione che ho adottato è stata quella di scrivere una mia piccola libreria per la lettura dei file .ODS.

Piccola e semplice, queste sono le parole chiave. Una piccola libreria, con un numero limitato di funzioni. Che legga i dati da un file .ODS. Semplice da utilizzare, da testare e da modificare.

RedOdsReader

RedOdsReader è il nome che ho dato alla classe per la lettura dei file .ODS. RedOdsReader è ospitata su GitHub:

https://github.com/robertorossi73/redodsreader

Ovviamente è distribuita con una licenza libera, anzi, liberissima. La licenza MIT. Questa licenza non solo permette di utilizzare il codice in progetto open source o libero, ma anche in prodotti commerciali.

RedOdsReader non è una libreria nel vero senso della parola ma è una semplice classe scritta in puro codice C# e utilizzabile in qualsiasi progetto sviluppato con .NET Framework 4.5 o successivo oppure con .NET Core.

RedOdsReader per leggere file .ODS

Veniamo al sodo e vediamo come usare RedOdsReader per leggere un file .ODS.

Prima di tutto prendiamo la soluzione del nostro software e aggiungiamo il file RedOdsCl.cs(che contiene tutto ciò che ci serve). Come secondo, e ultimo, passaggio è necessario includere nel progetto i riferimenti a System.IO.Compression e System.IO.Compression.FileSystem.

Ovviamente RedOdsCl.cs è presente su GitHub.

A questo punto iniziano a scrivere un po'di codice.

AlternativeText

Allo stato attuale la libreria è in fase di sviluppo quindi, in futuro, arriveranno cambiamenti, miglioramenti ed eventuali correzioni.

Per quanto riguarda prestazioni e affidabilità, in questo momento la sto usando nei miei progetti e sono sufficientemente soddisfatto.

Nel futuro...

Nel futuro di questa libreria vedo diverse modifiche necessarie e molte, possibili, aggiunte.

Ci sono molto idee che mi piacerebbe implementare. Vediamone alcune, in ordine sparso:

  • Possibilità di leggere i file quando questi sono già aperti in LibreOffice.
  • Supporto per i file contenente gruppi di linee.
  • Supporto per i file con linee di intestazione.
  • Modifica dei parametri di alcune funzioni per renderle compatibili con la logica delle coordinate di foglio che prevedono prima l'indicazione della colonna e poi quella della riga.
  • Possibilità di indicare le coordinate di foglio specificando la colonna come lettera e non solo come indice numerico.
  • Implementazione dell'interfaccia IEnumerable per leggere i dati di un foglio/tabella.
  • Introduzione di un sistema ad oggetti per la lettura delle celle.
  • Implementazione di un sistema di esportazione detto di in formato CSV.
  • Trasformazione della classe C# in libreria in modo da poterla usare anche con altri linguaggi supportati da .Net.
  • Possibilità di ottenere valori diversi dal tipo stringa.

E tanto altro…

Riferimenti

Ecco alcune pagine interessanti riguardanti il formato .ODS e il linguaggio C#: