Prečítajte si hodnotu bunky programu Excel skôr ako vzorec s Apache POI

1. Úvod

Pri čítaní súboru programu Excel v prostredí Java zvyčajne chceme načítať hodnoty buniek, aby sme mohli vykonať nejaký výpočet alebo vygenerovať správu. Môžeme sa však stretnúť s jednou alebo viacerými bunkami, ktoré obsahujú vzorce a nie hodnoty nespracovaných údajov. Ako sa teda dostaneme k skutočným dátovým hodnotám týchto buniek?

V tomto výučbe sa pozrieme na rôzne spôsoby čítania hodnôt buniek programu Excel - a nie na vzorec, ktorý počíta hodnoty buniek - pomocou knižnice Java Apache POI.

Existujú dva spôsoby riešenia tohto problému:

  • Načítajte poslednú hodnotu uloženú v pamäti pre bunku
  • Vyhodnoťte vzorec za behu a získate hodnotu bunky

2. Závislosť od Maven

Do nášho súboru pom.xml pre POI Apache musíme pridať nasledujúcu závislosť:

 org.apache.poi poi-ooxml 4.1.1 

Najnovšiu verziu poi-ooxml si môžete stiahnuť z Maven Central.

3. Načítajte hodnotu poslednej medzipamäte

Keď vzorec počíta svoju hodnotu, program Excel uloží do bunky dva objekty. Jedným je samotný vzorec a druhým hodnota v pamäti. Hodnota uložená v pamäti obsahuje poslednú hodnotu vyhodnotenú vzorcom.

Myšlienkou teda je, že môžeme načítať poslednú hodnotu uloženú v pamäti a považovať ju za hodnotu bunky. Nemusí vždy platiť, že posledná hodnota v medzipamäti je správna hodnota bunky. Keď však pracujeme so súborom programu Excel, ktorý je uložený a v súbore nie sú žiadne nedávne úpravy, mala by byť poslednou hodnotou v medzipamäti hodnota bunky.

Pozrime sa, ako načítať poslednú hodnotu uloženú v pamäti pre bunku:

FileInputStream inputStream = nový FileInputStream (nový súbor ("temp.xlsx")); Zošit zošit = nový XSSFWorkbook (inputStream); Hárok listu = workbook.getSheetAt (0); CellAddress cellAddress = nová CellAddress ("C2"); Riadok riadku = sheet.getRow (cellAddress.getRow ()); Bunka bunka = riadok.getCell (cellAddress.getColumn ()); if (cell.getCellType () == CellType.FORMULA) {switch (cell.getCachedFormulaResultType ()) {case BOOLEAN: System.out.println (cell.getBooleanCellValue ()); prestávka; prípad NUMERIC: System.out.println (cell.getNumericCellValue ()); prestávka; prípad STRING: System.out.println (cell.getRichStringCellValue ()); prestávka; }}

4. Vyhodnoťte vzorec a získate hodnotu bunky

Apache POI poskytuje a Hodnotiaci vzorec trieda, ktorá nám umožňuje vypočítať výsledky vzorcov v hárkoch programu Excel.

Môžeme teda použiť Hodnotiaci vzorec priamo vypočítať hodnotu bunky za behu. The Hodnotiaci vzorec trieda poskytuje metódu s názvom hodnotiťFormulaCell, ktorá vyhodnotí hodnotu bunky pre daný Bunka objekt a vráti a CellType objekt, ktorý predstavuje dátový typ hodnoty bunky.

Pozrime sa na tento prístup v praxi:

// existujúce nastavenie zošita FormulaEvaluator evaluator = workbook.getCreationHelper (). createFormulaEvaluator (); // existujúce nastavenie hárkov, riadkov a buniek if (cell.getCellType () == CellType.FORMULA) {switch (evaluator.evaluateFormulaCell (cell)) {case BOOLEAN: System.out.println (cell.getBooleanCellValue ()); prestávka; prípad NUMERIC: System.out.println (cell.getNumericCellValue ()); prestávka; prípad STRING: System.out.println (cell.getStringCellValue ()); prestávka; }} 

5. Aký prístup zvoliť

Jednoduchý rozdiel medzi týmito dvoma prístupmi je v tom, že prvá metóda používa poslednú hodnotu uloženú v pamäti a druhá metóda vyhodnocuje vzorec za behu.

Ak pracujeme so súborom programu Excel, ktorý je už uložený a nebudeme robiť zmeny v tejto tabuľke za behu, potom je prístup v hodnotách uložených v medzipamäti lepší, pretože nemusíme hodnotiť vzorec.

Ak však vieme, že za behu budeme robiť časté zmeny, je lepšie vyhodnotiť vzorec za behu a načítať hodnotu bunky.

6. Záver

V tomto rýchlom článku sme videli dva spôsoby, ako získať hodnotu bunky programu Excel namiesto vzorca, ktorý ju počíta.

Úplný zdrojový kód tohto článku je k dispozícii na GitHub.


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