Lees Excel-celwaarde in plaats van formule met Apache POI

1. Inleiding

Wanneer we een Excel-bestand in Java lezen, willen we meestal de waarden van cellen lezen om een ​​berekening uit te voeren of een rapport te genereren. We kunnen echter een of meer cellen tegenkomen die formules bevatten in plaats van onbewerkte gegevenswaarden. Dus, hoe komen we aan de feitelijke gegevenswaarden van die cellen?

In deze zelfstudie gaan we kijken naar verschillende manieren om Excel-celwaarden te lezen - in plaats van de formule die de celwaarden berekent - met de Apache POI Java-bibliotheek.

Er zijn twee manieren om dit probleem op te lossen:

  • Haal de laatste gecachte waarde voor de cel op
  • Evalueer de formule tijdens runtime om de celwaarde te krijgen

2. Maven Afhankelijkheid

We moeten de volgende afhankelijkheid toevoegen aan ons pom.xml-bestand voor Apache POI:

 org.apache.poi poi-ooxml 4.1.1 

De nieuwste versie van poi-ooxml kan worden gedownload vanaf Maven Central.

3. Haal de laatste gecachte waarde op

Excel slaat twee objecten op voor de cel wanneer een formule de waarde berekent. Een daarvan is de formule zelf en de tweede is de waarde in de cache. De waarde in het cachegeheugen bevat de laatste waarde die door de formule is geëvalueerd.

Dus het idee hier is dat we de laatste gecachte waarde kunnen ophalen en deze als celwaarde kunnen beschouwen. Het is misschien niet altijd waar dat de laatste waarde in de cache de juiste celwaarde is. Als we echter werken met een Excel-bestand dat is opgeslagen en er zijn geen recente wijzigingen aan het bestand, dan moet de laatste waarde in het cachegeheugen de celwaarde zijn.

Laten we eens kijken hoe we de laatste gecachte waarde voor een cel kunnen ophalen:

FileInputStream inputStream = nieuwe FileInputStream (nieuw bestand ("temp.xlsx")); Werkboekwerkmap = nieuw XSSFWorkbook (inputStream); Bladblad = werkmap.getSheetAt (0); CellAddress cellAddress = nieuw CellAddress ("C2"); Rij rij = sheet.getRow (cellAddress.getRow ()); Celcel = row.getCell (cellAddress.getColumn ()); if (cell.getCellType () == CellType.FORMULA) {schakelaar (cell.getCachedFormulaResultType ()) {case BOOLEAN: System.out.println (cell.getBooleanCellValue ()); breken; geval NUMERIEK: System.out.println (cell.getNumericCellValue ()); breken; geval STRING: System.out.println (cell.getRichStringCellValue ()); breken; }}

4. Evalueer de formule om de celwaarde te krijgen

Apache POI biedt een Formule Evaluator class, waarmee we de resultaten van formules kunnen berekenen in Excel-bladen.

Dus we kunnen gebruiken Formule Evaluator om de celwaarde tijdens runtime direct te berekenen. De Formule Evaluator class biedt een methode met de naam evaluerenFormuleCell, die de celwaarde voor het gegeven evalueert Cel object en retourneert een CellType object, dat het gegevenstype van de celwaarde vertegenwoordigt.

Laten we deze aanpak in actie zien:

// bestaande werkmap setup FormulaEvaluator evaluator = workbook.getCreationHelper (). createFormulaEvaluator (); // bestaande blad-, rij- en celinstellingen if (cell.getCellType () == CellType.FORMULA) {switch (evaluator.evaluateFormulaCell (cel)) {case BOOLEAN: System.out.println (cell.getBooleanCellValue ()); breken; geval NUMERIEK: System.out.println (cell.getNumericCellValue ()); breken; geval STRING: System.out.println (cell.getStringCellValue ()); breken; }} 

5. Welke aanpak te kiezen

Het simpele verschil tussen de twee benaderingen hier is dat de eerste methode de laatste gecachte waarde gebruikt, en de tweede methode evalueert de formule tijdens runtime.

Als we werken met een Excel-bestand dat al is opgeslagen en we zullen tijdens runtime geen wijzigingen aanbrengen in die spreadsheet, dan is de benadering van de waarde in het cachegeheugen beter omdat we de formule niet hoeven te evalueren.

Als we echter weten dat we tijdens runtime regelmatig wijzigingen gaan aanbrengen, is het beter om de formule tijdens runtime te evalueren om de celwaarde op te halen.

6. Conclusie

In dit korte artikel hebben we twee manieren gezien om de waarde van een Excel-cel te krijgen in plaats van de formule die deze berekent.

De volledige broncode voor dit artikel is beschikbaar op GitHub.