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.