From 5e56c6d7d2a30ac97cf4e122e93082faff2a3297 Mon Sep 17 00:00:00 2001 From: chaneylc Date: Wed, 5 Jul 2023 17:43:39 -0500 Subject: [PATCH] xlsx formula fix for field import files --- .../tracker/objects/FieldFileObject.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/fieldbook/tracker/objects/FieldFileObject.java b/app/src/main/java/com/fieldbook/tracker/objects/FieldFileObject.java index 2fb8a76c9..e4b706140 100644 --- a/app/src/main/java/com/fieldbook/tracker/objects/FieldFileObject.java +++ b/app/src/main/java/com/fieldbook/tracker/objects/FieldFileObject.java @@ -1,5 +1,9 @@ package com.fieldbook.tracker.objects; +import static org.apache.poi.ss.usermodel.Cell.CELL_TYPE_BOOLEAN; +import static org.apache.poi.ss.usermodel.Cell.CELL_TYPE_NUMERIC; +import static org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING; + import android.content.Context; import android.database.Cursor; import android.net.Uri; @@ -11,8 +15,10 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DataFormatter; +import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -443,6 +449,8 @@ public String[] readNext() { ArrayList rows = new ArrayList<>(); XSSFSheet sheet = wb.getSheetAt(0); + XSSFFormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); + for (Iterator it = sheet.rowIterator(); it.hasNext();) { rows.add((XSSFRow) it.next()); } @@ -454,7 +462,22 @@ public String[] readNext() { ArrayList data = new ArrayList<>(); for (Iterator it = rows.get(currentRow).cellIterator(); it.hasNext();) { XSSFCell cell = (XSSFCell) it.next(); - data.add(fmt.formatCellValue(cell)); + if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {//formula + int type = evaluator.evaluateFormulaCell(cell); + switch (type) { + case CELL_TYPE_BOOLEAN: + data.add(String.valueOf(cell.getBooleanCellValue())); + break; + case CELL_TYPE_NUMERIC: + data.add(String.valueOf(cell.getNumericCellValue())); + break; + default: + data.add(cell.getStringCellValue()); + break; + } + } else { + data.add(fmt.formatCellValue(cell)); + } } currentRow += 1; @@ -472,6 +495,9 @@ public void close() { * @return attempt to parse the string value of the cell */ private static String getCellStringValue(XSSFCell cell) { + + FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator(); + switch (cell.getCellType()) { case 0: { //numeric return String.valueOf(cell.getNumericCellValue()); @@ -479,6 +505,16 @@ private static String getCellStringValue(XSSFCell cell) { case 1: { //text return cell.getStringCellValue(); } + case Cell.CELL_TYPE_FORMULA: { //formula + switch (evaluator.evaluateFormulaCell(cell)) { + case CELL_TYPE_BOOLEAN: + return String.valueOf(cell.getBooleanCellValue()); + case CELL_TYPE_NUMERIC: + return String.valueOf(cell.getNumericCellValue()); + case CELL_TYPE_STRING: + return cell.getStringCellValue(); + } + } case 3: { //boolean return String.valueOf(cell.getBooleanCellValue()); }