]> source.dussan.org Git - poi.git/commitdiff
[github-191] Fix RuntimeException on array formula referencing blank cell. Thanks...
authorPJ Fanning <fanningpj@apache.org>
Fri, 14 Aug 2020 07:42:18 +0000 (07:42 +0000)
committerPJ Fanning <fanningpj@apache.org>
Fri, 14 Aug 2020 07:42:18 +0000 (07:42 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1880844 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java
src/testcases/org/apache/poi/ss/formula/TestWorkbookEvaluator.java

index 060f274ef088c5db631bc2cb98b165b4c0d11258..77d0937876eccd370e8af9d8cedd7d240f4c06f4 100644 (file)
@@ -633,6 +633,12 @@ public final class WorkbookEvaluator {
         else {
             value = dereferenceResult(evaluationResult, ec.getRowIndex(), ec.getColumnIndex());
         }
+        if (value == BlankEval.instance) {
+            // Note Excel behaviour here. A blank final final value is converted to zero.
+            return NumberEval.ZERO;
+            // Formulas _never_ evaluate to blank.  If a formula appears to have evaluated to
+            // blank, the actual value is empty string. This can be verified with ISBLANK().
+        }
         
         return value;
     }
index 06c37dc0250641105446b26d21e1412063043327..bf89fca10cdb204be0d0d1d66f894051f44edbc5 100644 (file)
@@ -46,6 +46,7 @@ import org.apache.poi.ss.usermodel.Name;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.util.CellRangeAddress;
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -613,4 +614,42 @@ public class TestWorkbookEvaluator {
         
         testIFEqualsFormulaEvaluation_teardown(wb);
     }
+
+    @Test
+    public void testRefToBlankCellInArrayFormula() {
+        Workbook wb = new HSSFWorkbook();
+        Sheet sheet = wb.createSheet();
+        Row row = sheet.createRow(0);
+        Cell cellA1 = row.createCell(0);
+        Cell cellB1 = row.createCell(1);
+        Cell cellC1 = row.createCell(2);
+        Row row2 = sheet.createRow(1);
+        Cell cellA2 = row2.createCell(0);
+        Cell cellB2 = row2.createCell(1);
+        Cell cellC2 = row2.createCell(2);
+        Row row3 = sheet.createRow(2);
+        Cell cellA3 = row3.createCell(0);
+        Cell cellB3 = row3.createCell(1);
+        Cell cellC3 = row3.createCell(2);
+
+        cellA1.setCellValue("1");
+        // cell B1 intentionally left blank
+        cellC1.setCellValue("3");
+
+        cellA2.setCellFormula("A1");
+        cellB2.setCellFormula("B1");
+        cellC2.setCellFormula("C1");
+
+        sheet.setArrayFormula("A1:C1", CellRangeAddress.valueOf("A3:C3"));
+
+        wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
+
+        assertEquals(cellA2.getStringCellValue(), "1");
+        assertEquals(cellB2.getNumericCellValue(),0, 0.00001);
+        assertEquals(cellC2.getStringCellValue(),"3");
+
+        assertEquals(cellA3.getStringCellValue(), "1");
+        assertEquals(cellB3.getNumericCellValue(),0, 0.00001);
+        assertEquals(cellC3.getStringCellValue(),"3");
+    }
 }