Errore di lettura di una cella di un file ods

di ZioCrick il
8 risposte

Buongiorno,

ho un problema strano.
Anni fa riuscivo a leggere un file ods da Java con un programma simile a questo:
Esempio di lettura di file ods

Adesso che ho di nuovo la stessa esigenza, ci ho riprovato ma sulla riga in cui uso la cell.getValue() mi da l'errore:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "org.jopendocument.dom.OOXML.getVersion()" because "<local3>" is null

Di fatto il file esiste, lo apre, la getCellAt funziona ma la getValue da errore.

Qualcuno ha idea da cosa potrebbe dipendere?

8 Risposte

  • Quell'errore può dipendere da un po' di cose:

    1 - Dalla versione della libreria jOpenDocument utilizzata in combinazione con la versione della JVM

    2 - Dal file ODS

    3 - Dall'effettivo contenuto della cella che stai andando a leggere

    Rispondo in ordine inverso (dalla 3 alla 1).

    Caso 3:

    Senza vedere il codice, vado un po' a tentativi; ad ogni modo, devi assicurarti che getCellAt() restituisca un oggetto non nullo, prima di invocare getValue():

    MutableCell cell = sheet.getCellAt( ... );
    if (cell != null) {
       Object obj = cell.getValue();
    }

    Dubito sia questo il caso, vista la specificità del messaggio dell'eccezione sollevata, ma non si sa mai. Se la logica è corretta (verifico che la cella "esista", cioè sia una cella con un valore, prima di leggerne il contenuto), allora può essere il caso 2.

    Caso 2:

    Può essere che il file ODS sia stato generato "male" o che sia stato scritto con una versione "vecchia" del programma/libreria che lo ha generato. In questo caso, possono mancare dei descrittori che la libreria jOpenDocument si aspetta (uno dei descrittori è la versione del formato ODS utilizzato dal file). In questo caso si dovrebbe risolvere aprendo il documento ODS con un programma aggiornato (LibreOffice, ad esempio), fare una modifica minimale (anche una "finta modifica") e poi ri-salvare il documento, meglio se usando la funzione "Salva con nome...", per generare una nuova copia integrale del documento.

    Se nemmeno questo funziona, allora potrebbe essere il caso 1.

    Caso 1:

    A quanto pare, questa eccezione può venire sollevata se si verificano determinate combinazioni di versione JVM / Libreria jOpenDocument, specialmente se si utilizza una versione "non recentissima" della libreria in combinazione con versioni più recenti della JVM (dalla 11 in poi). In questo caso bisognerebbe verificare di utilizzare l'ultima versione di jOpenDocument (sul Maven l'ultima versione disponibile è la 1.3, ma sul sito della libreria ci sono anche la 1.4 e la 1.5 da scaricare).

  • Carissimo, ti ringrazio molto per le tue indicazioni! ;-)

    Di fatto l'ipotesi 3 non è applicabile perché le celle contengono veramente i dati e la 2 neppure perchè il file ods lo genero con un altro mio programma Java che utilizza la stessa versione di jOpenDocument che è la 1.3.
    Tra l'altro entrambi realizzati con lo stesso ambiente Ant di NetBeans con Java 17 su Debian 12 .

    L'ipotesi 1 (che è sempre stata la mia spina nel fianco) la verificherò prossimamente perché al momento ho risolto con un'idea che mi ha dato uno staff di CodeRanch qui: forum

    In effetti il metodo cell.toString() restituisce una stringa complicata ma che include anche il contenuto della cella.
    Ho dovuto tribolare parecchio per individuare in modo univoco ed estrarre la stringa che mi serviva da Java ma alla fine ce l'ho fatta.

    In futuro spero vivamente di capire quale incompatibilità ci sia tra le varie versioni delle librerie di NetBeans e quelle aggiunte da me come jOpenDocument, così magari porrò fine a questo tipo di problemi.

  • Sarebbe interessante vedere se la stessa eccezione viene sollevata utilizzando questo:

    String content = cell.getTextValue();

    (che, se dovesse funzionare, forse ti semplificherebbe le cose)

  • Ci ho provato ma purtroppo mi da lo stesso errore. :-(

  • E' molto probabile, quindi, che il problema nasca da un qualche tipo di incompatibilità tra la libreria e la versione di Java. Probabilmente la jOpenDocument 1.3 utilizza internamente una classe del core che è stata riscritta nelle versioni più recenti della JDK (e resa più conforme agli standard attuali) e questo ha ripercussioni negative sul funzionamento.

    Dovrebbe essere l'autore della libreria a fornire una versione compatibile con le JDK più recenti (se è sua intenzione mantenerla).

    Nel sito, come detto, esistono due versioni "più recenti", magari queste sono state adeguate ai nuovi standard.

  • 25/08/2026 - SpiritoLibero ha scritto:

    Nel sito, come detto, esistono due versioni "più recenti", magari queste sono state adeguate ai nuovi standard.

    Grazie per avermelo ricordato, perché preso dai vari problemi che sto avendo ultimamente me ne ero scordato.
    Me le sono scaricate e le ho provate, ma mi da lo stesso errore. :-(
    L'unica cosa che cambia è il numero nella stringa "<local3>" che è diventato "<local4>" e poi "<local5>".
    Questo mi fa pensare che il problema non stia nella versione di jOpenDocument.
    Che ne dici?

  • Secondo me jOpenDocument è semplicemente troppo vecchia per poter operare con le nuove versioni di JDK. Ho scaricato il sorgente dell'ultima versione disponibile (1.5) ed è stata scritta usando la JDK 5 (la versione successiva, JDK 6, è andata in fine vita nel 2013).

  • Accipicchia!  Allora mi sa che devo trovare un'alternativa a jOpenDocument!
    E anche in questo caso brancolo nel buio, per cui qualsiasi suggerimento è il benvenuto. ;-)

Devi accedere o registrarti per scrivere nel forum
8 risposte