Olvassa el az Excel cella értékét, nem pedig a képletet Apache POI-val

1. Bemutatkozás

Ha Java-fájlokat olvasunk Java-ban, általában a cellák értékeit akarjuk elolvasni, hogy valamilyen számítást végezzünk, vagy jelentést hozzunk létre. Találkozhatunk azonban egy vagy több cellával, amelyek képleteket tartalmaznak, nem pedig nyers adatértékeket. Tehát hogyan juthatunk el a cellák tényleges adatértékeihez?

Ebben az oktatóanyagban különböző módszereket fogunk megvizsgálni az Excel cellaértékek olvasására - nem pedig a cellaértékeket kiszámító képletre - az Apache POI Java könyvtár segítségével.

Kétféle módon lehet megoldani ezt a problémát:

  • Hívja le a cella utolsó gyorsítótárazott értékét
  • Értékelje a képletet futás közben, hogy megkapja a cella értékét

2. Maven-függőség

A következő függőséget kell hozzáadnunk a pom.xml fájlunkba az Apache POI-hoz:

 org.apache.poi poi-ooxml 4.1.1 

A poi-ooxml legújabb verziója letölthető a Maven Central oldalról.

3. Hozza le az utolsó gyorsítótárazott értéket

Az Excel két objektumot tárol a cellához, amikor a képlet kiszámítja az értékét. Az egyik maga a képlet, a második pedig a gyorsítótárazott érték. A gyorsítótárazott érték tartalmazza a képlettel kiértékelt utolsó értéket.

Tehát az az ötlet, hogy lekérhetjük az utolsó gyorsítótárazott értéket, és cellaértéknek tekintjük. Nem mindig igaz, hogy az utolsó gyorsítótárazott érték a helyes cellaérték. Ha azonban egy mentett Excel fájllal dolgozunk, és a fájlon nincsenek legutóbbi módosítások, akkor az utolsó gyorsítótárazott értéknek a cellának kell lennie.

Nézzük meg, hogyan lehet lekérni a cellák utolsó gyorsítótárazott értékét:

FileInputStream inputStream = új FileInputStream (új File ("temp.xlsx")); Munkafüzet munkafüzet = new XSSFWorkbook (inputStream); Laplap = munkafüzet.getSheetAt (0); CellAddress cellAddress = új CellAddress ("C2"); Sor sor = sheet.getRow (cellAddress.getRow ()); Cellasejt = row.getCell (cellAddress.getColumn ()); if (cell.getCellType () == CellType.FORMULA) {switch (cell.getCachedFormulaResultType ()) {eset BOOLEAN: System.out.println (cell.getBooleanCellValue ()); szünet; eset SZÁM: System.out.println (cell.getNumericCellValue ()); szünet; eset STRING: System.out.println (cell.getRichStringCellValue ()); szünet; }}

4. Értékelje ki a képletet a cellaérték megszerzéséhez

Az Apache POI a FormulaEvaluator osztály, amely lehetővé teszi számunkra a képletek eredményeinek kiszámítását Excel lapokban.

Tehát használhatjuk FormulaEvaluator hogy közvetlenül kiszámítsuk a cella értékét futás közben. A FormulaEvaluator osztály biztosítja az úgynevezett módszert assessFormulaCell, amely kiértékeli az adott cellaértéket Sejt objektumot ad vissza CellType objektum, amely a cellaérték adattípusát képviseli.

Lássuk ezt a megközelítést működés közben:

// meglévő munkafüzet beállítása FormulaEvaluator kiértékelő = workbook.getCreationHelper (). createFormulaEvaluator (); // meglévő Sheet, Row és Cell beállítás, ha (cell.getCellType () == CellType.FORMULA) {switch (Evaluator.evaluateFormulaCell (cell)) {eset BOOLEAN: System.out.println (cell.getBooleanCellValue ()); szünet; eset SZÁM: System.out.println (cell.getNumericCellValue ()); szünet; eset STRING: System.out.println (cell.getStringCellValue ()); szünet; }} 

5. Melyik megközelítést válassza

A két megközelítés közötti egyszerű különbség itt az, hogy az első módszer az utolsó gyorsítótárazott értéket használja, a második módszer a képletet futás közben értékeli.

Ha egy már mentett Excel fájllal dolgozunk, és nem fogunk futás közben változtatni ezen a táblázaton, akkor a gyorsítótárazott érték megközelítés jobb, mivel nem kell értékelnünk a képletet.

Ha azonban tudjuk, hogy futás közben gyakran változtatunk, akkor jobb, ha a cellaérték beolvasásához futás közben értékeljük a képletet.

6. Következtetés

Ebben a gyors cikkben két módot láttunk az Excel cellájának megszerzésére, nem pedig az azt kiszámító képletre.

A cikk teljes forráskódja elérhető a GitHub oldalon.