Čitajte vrijednost Excel ćelije umjesto formule s Apache POI

1. Uvod

Kada čitamo Excel datoteku na Javi, obično želimo pročitati vrijednosti stanica kako bismo izvršili neko računanje ili generirali izvješće. Međutim, možemo naići na jednu ili više ćelija koje sadrže formule, a ne vrijednosti sirovih podataka. Pa, kako doći do stvarnih vrijednosti podataka tih stanica?

U ovom ćemo uputstvu razmotriti različite načine čitanja vrijednosti Excel-ovih ćelija - umjesto formule koja izračunava vrijednosti ćelija - pomoću Apache POI Java knjižnice.

Postoje dva načina za rješavanje ovog problema:

  • Dohvati zadnju predmemoriranu vrijednost za ćeliju
  • Procijenite formulu tijekom izvođenja da biste dobili vrijednost ćelije

2. Ovisnost Mavena

Moramo dodati sljedeću ovisnost u našu datoteku pom.xml za Apache POI:

 org.apache.poi poi-ooxml 4.1.1 

Najnoviju verziju poi-ooxml možete preuzeti s Maven Central.

3. Dohvati zadnju predmemoriranu vrijednost

Excel pohranjuje dva objekta za ćeliju kada formula izračunava njezinu vrijednost. Jedna je sama formula, a druga je predmemorirana vrijednost. Predmemorirana vrijednost sadrži zadnju vrijednost vrednovanu formulom.

Dakle, ideja je da možemo dohvatiti zadnju predmemoriranu vrijednost i smatrati je vrijednošću ćelije. Možda nije uvijek točno da je zadnja predmemorirana vrijednost ispravna vrijednost ćelije. Međutim, kada radimo s Excel datotekom koja je spremljena i nema nedavnih izmjena datoteke, tada bi posljednja predmemorirana vrijednost trebala biti vrijednost ćelije.

Pogledajmo kako dohvatiti zadnju predmemoriranu vrijednost za ćeliju:

FileInputStream inputStream = novi FileInputStream (nova datoteka ("temp.xlsx")); Radna bilježnica radne knjige = nova XSSFWorkbook (inputStream); List listova = workbook.getSheetAt (0); CellAddress cellAddress = nova CellAddress ("C2"); Red reda = list.getRow (cellAddress.getRow ()); Ćelija ćelije = row.getCell (cellAddress.getColumn ()); if (cell.getCellType () == CellType.FORMULA) {switch (cell.getCachedFormulaResultType ()) {case BOOLEAN: System.out.println (cell.getBooleanCellValue ()); pauza; slučaj NUMERIČKI: System.out.println (cell.getNumericCellValue ()); pauza; slučaj STRING: System.out.println (cell.getRichStringCellValue ()); pauza; }}

4. Procijenite formulu da biste dobili vrijednost ćelije

Apache POI pruža a Procjenitelj formule klase, koja nam omogućuje izračunavanje rezultata formula u Excel listovima.

Dakle, možemo koristiti Procjenitelj formule za izračun vrijednosti ćelije tijekom izvođenja. The Procjenitelj formule klasa pruža metodu koja se naziva procijenitiFormulaCell, koja procjenjuje vrijednost ćelije za zadani Ćelija objekt i vraća a CellType objekt koji predstavlja tip podataka vrijednosti ćelije.

Pogledajmo ovaj pristup na djelu:

// postojeće postavljanje radne knjige FormulaEvaluator evaluator = workbook.getCreationHelper (). createFormulaEvaluator (); // postojeće postavljanje lista, retka i ćelije if (cell.getCellType () == CellType.FORMULA) {switch (evaluator.evaluateFormulaCell (cell)) {case BOOLEAN: System.out.println (cell.getBooleanCellValue ()); pauza; slučaj NUMERIČKI: System.out.println (cell.getNumericCellValue ()); pauza; slučaj STRING: System.out.println (cell.getStringCellValue ()); pauza; }} 

5. Koji pristup odabrati

Ovdje je jednostavna razlika između dva pristupa u tome što prva metoda koristi posljednju predmemoriranu vrijednost, a druga metoda procjenjuje formulu tijekom izvođenja.

Ako radimo s Excel datotekom koja je već spremljena i nećemo mijenjati tu proračunsku tablicu tijekom izvođenja, tada je pristup predmemoriranim vrijednostima bolji jer ne moramo procijeniti formulu.

Međutim, ako znamo da ćemo vršiti česte promjene tijekom izvođenja, tada je bolje procijeniti formulu tijekom izvođenja kako bismo dohvatili vrijednost ćelije.

6. Zaključak

U ovom kratkom članku vidjeli smo dva načina kako dobiti vrijednost Excel ćelije, a ne formulu koja je izračunava.

Kompletni izvorni kod za ovaj članak dostupan je na GitHubu.


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