From e9a545bb4f36d824bab47a3afd698c29f61f4ea4 Mon Sep 17 00:00:00 2001 From: bellerbrock Date: Wed, 4 Sep 2024 15:23:44 -0400 Subject: [PATCH] access xlsx cell values explictly with col index instead of iterator that skips empty cells --- .../tracker/objects/FieldFileObject.java | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) 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 8848fb831..4934df132 100644 --- a/app/src/main/java/com/fieldbook/tracker/objects/FieldFileObject.java +++ b/app/src/main/java/com/fieldbook/tracker/objects/FieldFileObject.java @@ -460,37 +460,40 @@ public void open() { public String[] readNext() { DataFormatter fmt = new DataFormatter(); - 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()); - } - - if (currentRow >= rows.size()) { + if (currentRow >= sheet.getPhysicalNumberOfRows()) { return null; } + XSSFRow row = sheet.getRow(currentRow); ArrayList data = new ArrayList<>(); - for (Iterator it = rows.get(currentRow).cellIterator(); it.hasNext();) { - XSSFCell cell = (XSSFCell) it.next(); - 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; + + int maxColumns = sheet.getRow(0).getLastCellNum(); // Get total number of columns from header + + for (int colIdx = 0; colIdx < maxColumns; colIdx++) { + XSSFCell cell = (row == null) ? null : row.getCell(colIdx); + + if (cell != null) { + 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)); } } else { - data.add(fmt.formatCellValue(cell)); + data.add(""); // Add empty string for missing/empty cells } }