Leggi il valore della cella di Excel invece della formula con Apache POI

1. Introduzione

Durante la lettura di un file Excel in Java, di solito si desidera leggere i valori delle celle per eseguire alcuni calcoli o generare un report. Tuttavia, potremmo incontrare una o più celle che contengono formule anziché valori di dati grezzi. Quindi, come otteniamo i valori dei dati effettivi di quelle celle?

In questo tutorial, esamineremo diversi modi per leggere i valori delle celle di Excel, piuttosto che la formula che calcola i valori delle celle, con la libreria Java POI di Apache.

Esistono due modi per risolvere questo problema:

  • Recupera l'ultimo valore memorizzato nella cache per la cella
  • Valuta la formula in fase di esecuzione per ottenere il valore della cella

2. Dipendenza da Maven

Dobbiamo aggiungere la seguente dipendenza nel nostro file pom.xml per Apache POI:

 org.apache.poi poi-ooxml 4.1.1 

L'ultima versione di poi-ooxml può essere scaricata da Maven Central.

3. Recuperare l'ultimo valore memorizzato nella cache

Excel archivia due oggetti per la cella quando una formula ne calcola il valore. Uno è la formula stessa e il secondo è il valore memorizzato nella cache. Il valore memorizzato nella cache contiene l'ultimo valore valutato dalla formula .

Quindi l'idea qui è che possiamo recuperare l'ultimo valore memorizzato nella cache e considerarlo come valore della cella. Potrebbe non essere sempre vero che l'ultimo valore memorizzato nella cache è il valore della cella corretto. Tuttavia, quando lavoriamo con un file Excel salvato e non ci sono modifiche recenti al file, l'ultimo valore memorizzato nella cache dovrebbe essere il valore della cella.

Vediamo come recuperare l'ultimo valore memorizzato nella cache per una cella:

FileInputStream inputStream = new FileInputStream(new File("temp.xlsx")); Workbook workbook = new XSSFWorkbook(inputStream); Sheet sheet = workbook.getSheetAt(0); CellAddress cellAddress = new CellAddress("C2"); Row row = sheet.getRow(cellAddress.getRow()); Cell cell = row.getCell(cellAddress.getColumn()); if (cell.getCellType() == CellType.FORMULA) { switch (cell.getCachedFormulaResultType()) { case BOOLEAN: System.out.println(cell.getBooleanCellValue()); break; case NUMERIC: System.out.println(cell.getNumericCellValue()); break; case STRING: System.out.println(cell.getRichStringCellValue()); break; } }

4. Valutare la formula per ottenere il valore della cella

Apache POI fornisce una classe FormulaEvaluator , che ci consente di calcolare i risultati delle formule nei fogli Excel.

Quindi, possiamo usare FormulaEvaluator per calcolare direttamente il valore della cella in fase di esecuzione. La classe FormulaEvaluator fornisce un metodo chiamato assessFormulaCell , che valuta il valore della cella per l' oggetto Cell specificato e restituisce un oggetto CellType , che rappresenta il tipo di dati del valore della cella.

Vediamo questo approccio in azione:

// existing Workbook setup FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); // existing Sheet, Row, and Cell setup if (cell.getCellType() == CellType.FORMULA) { switch (evaluator.evaluateFormulaCell(cell)) { case BOOLEAN: System.out.println(cell.getBooleanCellValue()); break; case NUMERIC: System.out.println(cell.getNumericCellValue()); break; case STRING: System.out.println(cell.getStringCellValue()); break; } } 

5. Quale approccio scegliere

La semplice differenza tra i due approcci qui è che il primo metodo utilizza l'ultimo valore memorizzato nella cache e il secondo metodo valuta la formula in fase di esecuzione.

Se stiamo lavorando con un file Excel già salvato e non apporteremo modifiche a quel foglio di calcolo in fase di esecuzione, l'approccio al valore memorizzato nella cache è migliore in quanto non è necessario valutare la formula.

Tuttavia, se sappiamo che apporteremo modifiche frequenti in fase di esecuzione, è meglio valutare la formula in fase di esecuzione per recuperare il valore della cella.

6. Conclusione

In questo rapido articolo, abbiamo visto due modi per ottenere il valore di una cella di Excel piuttosto che la formula che la calcola.

Il codice sorgente completo per questo articolo è disponibile su GitHub.