]> source.dussan.org Git - poi.git/commitdiff
SUMIFS should not sum if a value is #N/A
authorPJ Fanning <fanningpj@apache.org>
Fri, 30 Jul 2021 12:33:15 +0000 (12:33 +0000)
committerPJ Fanning <fanningpj@apache.org>
Fri, 30 Jul 2021 12:33:15 +0000 (12:33 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1891898 13f79535-47bb-0310-9956-ffa450edef68

poi/src/main/java/org/apache/poi/ss/formula/functions/Baseifs.java
poi/src/main/java/org/apache/poi/ss/formula/functions/Sumif.java

index 88ce9e3f4cda9b2a435bbe630514f119fb41a254..9bee7efb7c61f4f2e0a5eb564a29d5e70b20fbff 100644 (file)
@@ -121,8 +121,10 @@ import org.apache.poi.ss.formula.functions.Countif.ErrorMatcher;
      * @param ranges  criteria ranges
      * @param predicates  array of predicates, a predicate for each value in <code>ranges</code>
      * @return the computed value
+     * @throws EvaluationException if there is an issue with eval
      */
-    private static double aggregateMatchingCells(AreaEval sumRange, AreaEval[] ranges, I_MatchPredicate[] predicates) {
+    private static double aggregateMatchingCells(AreaEval sumRange, AreaEval[] ranges, I_MatchPredicate[] predicates)
+            throws EvaluationException {
         int height = ranges[0].getHeight();
         int width = ranges[0].getWidth();
 
@@ -158,17 +160,20 @@ import org.apache.poi.ss.formula.functions.Countif.ErrorMatcher;
      * @param relRowIndex
      * @param relColIndex
      * @return the aggregate input value corresponding to the given range coordinates
+     * @throws EvaluationException if there is an issue with eval
      */
-    private static double accumulate(AreaEval sumRange, int relRowIndex, int relColIndex) {
+    private static double accumulate(AreaEval sumRange, int relRowIndex, int relColIndex) throws EvaluationException {
         if (sumRange == null) return 1.0; // count
         
         ValueEval addend = sumRange.getRelativeValue(relRowIndex, relColIndex);
         if (addend instanceof NumberEval) {
-            return ((NumberEval)addend).getNumberValue();
+            return ((NumberEval) addend).getNumberValue();
+        } else if (addend instanceof ErrorEval) {
+            throw new EvaluationException((ErrorEval)addend);
+        } else {
+            // everything else (including string and boolean values) counts as zero
+            return 0.0;
         }
-        // everything else (including string and boolean values) counts as zero
-        return 0.0;
-
     }
 
     protected static AreaEval convertRangeArg(ValueEval eval) throws EvaluationException {
index e9a9f2c9c971912b2739c1fdb6ea87a7ee46ca3f..899ff71679fcf1b0fd6d9454a1f998caa12b93ce 100644 (file)
@@ -102,8 +102,11 @@ public final class Sumif extends Var2or3ArgFunction {
             ValueEval addend = aeSum.getRelativeValue(relRowIndex, relColIndex);
             if (addend instanceof NumberEval) {
                 return ((NumberEval) addend).getNumberValue();
+            } else if (addend instanceof ErrorEval) {
+                throw new EvaluationException((ErrorEval)addend);
             } else {
-                throw new EvaluationException(ErrorEval.NA);
+                // everything else (including string and boolean values) counts as zero
+                return 0.0;
             }
         }
     }