Les Excel-celleverdi snarere enn formelen med Apache POI

1. Introduksjon

Når vi leser en Excel-fil i Java, vil vi vanligvis lese verdiene til celler for å utføre noen beregning eller generere en rapport. Vi kan imidlertid støte på en eller flere celler som inneholder formler i stedet for rådataverdier. Så hvordan kommer vi til de faktiske dataverdiene til disse cellene?

I denne opplæringen skal vi se på forskjellige måter å lese Excel-celleverdier - i stedet for formelen som beregner celleverdiene - med Apache POI Java-biblioteket.

Det er to måter å løse dette problemet på:

  • Hent den siste bufrede verdien for cellen
  • Evaluer formelen ved kjøretid for å få celleverdien

2. Maven avhengighet

Vi må legge til følgende avhengighet i vår pom.xml-fil for Apache POI:

 org.apache.poi poi-ooxml 4.1.1 

Den siste versjonen av poi-ooxml kan lastes ned fra Maven Central.

3. Hent den siste bufrede verdien

Excel lagrer to objekter for cellen når en formel beregner verdien. Den ene er selve formelen, og den andre er den hurtigbufrede verdien. Den bufrede verdien inneholder den siste verdien som ble evaluert av formelen.

Så ideen her er at vi kan hente den siste hurtigbufrede verdien og betrakte den som celleverdi. Det er ikke alltid det stemmer at den siste hurtigbufrede verdien er riktig celleverdi. Imidlertid, når vi jobber med en Excel-fil som er lagret, og det ikke er noen endringer i filen, bør den siste bufrede verdien være celleverdien.

La oss se hvordan du henter den siste hurtigbufrede verdien for en celle:

FileInputStream inputStream = ny FileInputStream (ny fil ("temp.xlsx")); Arbeidsbok arbeidsbok = ny XSSFWorkbook (inputStream); Arkark = arbeidsbok.getSheetAt (0); CellAddress cellAddress = ny CellAddress ("C2"); Radrekke = ark.getRow (cellAddress.getRow ()); Cellecelle = row.getCell (cellAddress.getColumn ()); if (cell.getCellType () == CellType.FORMULA) {switch (cell.getCachedFormulaResultType ()) {case BOOLEAN: System.out.println (cell.getBooleanCellValue ()); gå i stykker; case NUMERIC: System.out.println (cell.getNumericCellValue ()); gå i stykker; sak STRING: System.out.println (cell.getRichStringCellValue ()); gå i stykker; }}

4. Evaluer formelen for å få celleverdien

Apache POI gir en FormulaEvaluator klasse, som gjør det mulig for oss å beregne resultatene av formler i Excel-ark.

Så, vi kan bruke FormulaEvaluator for å beregne celleverdien ved kjøretid direkte. De FormulaEvaluator klasse gir en metode som kalles evaluere Formelcelle, som evaluerer celleverdien for det gitte Celle objekt og returnerer a CellType objekt, som representerer datatypen for celleverdien.

La oss se denne tilnærmingen i aksjon:

// eksisterende arbeidsbokoppsett FormulaEvaluator evaluator = arbeidsbok.getCreationHelper (). createFormulaEvaluator (); // eksisterende oppsett av ark, rad og celle hvis (cell.getCellType () == CellType.FORMULA) {switch (evaluator.evaluateFormulaCell (cell)) {case BOOLEAN: System.out.println (cell.getBooleanCellValue ()); gå i stykker; case NUMERIC: System.out.println (cell.getNumericCellValue ()); gå i stykker; sak STRING: System.out.println (cell.getStringCellValue ()); gå i stykker; }} 

5. Hvilken tilnærming å velge

Den enkle forskjellen mellom de to tilnærmingene her er at den første metoden bruker den siste bufrede verdien, og den andre metoden evaluerer formelen ved kjøretid.

Hvis vi jobber med en Excel-fil som allerede er lagret, og vi ikke vil gjøre endringer i regnearket i løpetid, er tilnærmet hurtigbufret verdi bedre da vi ikke trenger å evaluere formelen.

Men hvis vi vet at vi kommer til å gjøre hyppige endringer ved kjøretid, er det bedre å evaluere formelen ved kjøretid for å hente celleverdien.

6. Konklusjon

I denne raske artikkelen så vi to måter å få verdien av en Excel-celle i stedet for formelen som beregner den.

Den komplette kildekoden for denne artikkelen er tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found