Læs Excel-celleværdi snarere end formlen med Apache-IP

1. Introduktion

Når vi læser en Excel-fil i Java, vil vi normalt læse cellernes værdier for at udføre nogle beregninger eller generere en rapport. Vi kan dog støde på en eller flere celler, der indeholder formler snarere end rådataværdier. Så hvordan kommer vi til de faktiske dataværdier for disse celler?

I denne vejledning vil vi se på forskellige måder at læse Excel-celleværdier - snarere end formlen, der beregner celleværdierne - med Apache POI Java-biblioteket.

Der er to måder at løse dette problem på:

  • Hent den sidste cachelagrede værdi for cellen
  • Evaluer formlen ved kørsel for at få celleværdien

2. Maven-afhængighed

Vi skal tilføje følgende afhængighed i vores pom.xml-fil til Apache POI:

 org.apache.poi poi-ooxml 4.1.1 

Den seneste version af poi-ooxml kan downloades fra Maven Central.

3. Hent den sidst cachelagrede værdi

Excel gemmer to objekter til cellen, når en formel beregner dens værdi. Den ene er selve formlen, og den anden er den cachelagrede værdi. Den cachelagrede værdi indeholder den sidste værdi, der evalueres af formlen.

Så ideen her er, at vi kan hente den sidste cachelagrede værdi og betragte den som celleværdi. Det er måske ikke altid rigtigt, at den sidste cachelagrede værdi er den korrekte celleværdi. Men når vi arbejder med en Excel-fil, der er gemt, og der ikke er nylige ændringer af filen, skal den sidste cachelagrede værdi være celleværdien.

Lad os se, hvordan man henter den sidste cachelagrede værdi for en celle:

FileInputStream inputStream = ny FileInputStream (ny fil ("temp.xlsx")); Arbejdsbog projektmappe = ny XSSFWorkbook (inputStream); Arkark = projektmappe.getSheetAt (0); CellAddress cellAddress = ny CellAddress ("C2"); Række række = sheet.getRow (cellAddress.getRow ()); Cellecelle = række.getCell (cellAddress.getColumn ()); hvis (cell.getCellType () == CellType.FORMULA) {switch (cell.getCachedFormulaResultType ()) {case BOOLEAN: System.out.println (cell.getBooleanCellValue ()); pause; sag NUMERISK: System.out.println (cell.getNumericCellValue ()); pause; sag STRING: System.out.println (cell.getRichStringCellValue ()); pause; }}

4. Evaluer formlen for at få celleværdien

Apache IP giver en Formelevaluator klasse, som gør det muligt for os at beregne resultaterne af formler i Excel-ark.

Så vi kan bruge Formelevaluator at beregne celleværdien direkte ved kørsel. Det Formelevaluator klasse giver en metode kaldet evaluereFormulaCell, der evaluerer celleværdien for det givne Celle objekt og returnerer a CellType objekt, som repræsenterer datatypen for celleværdien.

Lad os se denne tilgang i aktion:

// eksisterende opsætning af projektmappe FormulaEvaluator evaluator = workbook.getCreationHelper (). createFormulaEvaluator (); // eksisterende ark-, række- og celleopsætning hvis (cell.getCellType () == CellType.FORMULA) {switch (evaluator.evaluateFormulaCell (cell)) {case BOOLEAN: System.out.println (cell.getBooleanCellValue ()); pause; sag NUMERISK: System.out.println (cell.getNumericCellValue ()); pause; sag STRING: System.out.println (cell.getStringCellValue ()); pause; }} 

5. Hvilken tilgang der skal vælges

Den enkle forskel mellem de to tilgange her er, at den første metode bruger den sidste cachelagrede værdi, og den anden metode evaluerer formlen ved kørsel.

Hvis vi arbejder med en Excel-fil, der allerede er gemt, og vi ikke vil foretage ændringer i det regneark ved kørsel, så er cache-værditilgangen bedre, da vi ikke behøver at evaluere formlen.

Men hvis vi ved, at vi vil foretage hyppige ændringer ved kørsel, er det bedre at evaluere formlen ved kørsel for at hente celleværdien.

6. Konklusion

I denne hurtige artikel så vi to måder at få værdien af ​​en Excel-celle i stedet for formlen, der beregner den.

Den komplette kildekode til denne artikel er tilgængelig på GitHub.


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