Lesen Sie den Excel-Zellenwert anstelle der Formel mit dem Apache-POI

1. Einleitung

Beim Lesen einer Excel-Datei in Java möchten wir normalerweise die Werte von Zellen lesen, um eine Berechnung durchzuführen oder einen Bericht zu erstellen. Es kann jedoch vorkommen, dass eine oder mehrere Zellen Formeln anstelle von Rohdatenwerten enthalten. Wie kommen wir also zu den tatsächlichen Datenwerten dieser Zellen?

In diesem Lernprogramm werden verschiedene Möglichkeiten zum Lesen von Excel-Zellenwerten anstelle der Formel zur Berechnung der Zellenwerte mit der Apache POI Java-Bibliothek untersucht.

Es gibt zwei Möglichkeiten, um dieses Problem zu lösen:

  • Rufen Sie den letzten zwischengespeicherten Wert für die Zelle ab
  • Bewerten Sie die Formel zur Laufzeit, um den Zellenwert zu erhalten

2. Maven-Abhängigkeit

Wir müssen die folgende Abhängigkeit in unsere Datei pom.xml für Apache POI einfügen:

 org.apache.poi poi-ooxml 4.1.1 

Die neueste Version von poi-ooxml kann von Maven Central heruntergeladen werden.

3. Rufen Sie den zuletzt zwischengespeicherten Wert ab

Excel speichert zwei Objekte für die Zelle, wenn eine Formel ihren Wert berechnet. Eine ist die Formel selbst und die zweite ist der zwischengespeicherte Wert. Der zwischengespeicherte Wert enthält den letzten von der Formel ausgewerteten Wert .

Die Idee hier ist also, dass wir den letzten zwischengespeicherten Wert abrufen und als Zellenwert betrachten können. Es kann sein, dass der letzte zwischengespeicherte Wert nicht immer der richtige Zellenwert ist. Wenn wir jedoch mit einer gespeicherten Excel-Datei arbeiten und keine aktuellen Änderungen an der Datei vorgenommen wurden, sollte der letzte zwischengespeicherte Wert der Zellenwert sein.

Mal sehen, wie man den letzten zwischengespeicherten Wert für eine Zelle abruft:

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. Bewerten Sie die Formel, um den Zellenwert zu erhalten

Apache POI bietet eine FormulaEvaluator- Klasse, mit der wir die Ergebnisse von Formeln in Excel- Tabellen berechnen können .

Wir können also FormulaEvaluator verwenden , um den Zellenwert zur Laufzeit direkt zu berechnen. Die FormulaEvaluator- Klasse stellt eine Methode namens evaluFormulaCell bereit , die den Zellenwert für das angegebene Cell- Objekt auswertet und ein CellType- Objekt zurückgibt , das den Datentyp des Zellenwerts darstellt.

Lassen Sie uns diesen Ansatz in Aktion sehen:

// 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. Welchen Ansatz wählen?

Der einfache Unterschied zwischen den beiden Ansätzen besteht darin, dass die erste Methode den zuletzt zwischengespeicherten Wert verwendet und die zweite Methode die Formel zur Laufzeit auswertet.

Wenn wir mit einer bereits gespeicherten Excel-Datei arbeiten und zur Laufzeit keine Änderungen an dieser Tabelle vornehmen, ist der Ansatz mit zwischengespeicherten Werten besser, da wir die Formel nicht auswerten müssen.

Wenn wir jedoch wissen, dass wir zur Laufzeit häufige Änderungen vornehmen werden, ist es besser, die Formel zur Laufzeit auszuwerten, um den Zellenwert abzurufen.

6. Fazit

In diesem kurzen Artikel haben wir zwei Möglichkeiten gesehen, den Wert einer Excel-Zelle anstelle der Formel zu ermitteln, mit der sie berechnet wird.

Der vollständige Quellcode für diesen Artikel ist auf GitHub verfügbar.