]> source.dussan.org Git - poi.git/commitdiff
Fix bug 64238: Make LOOKUP functions deal with empty last arg correctly
authorDominik Stadler <centic@apache.org>
Sun, 25 Oct 2020 07:21:45 +0000 (07:21 +0000)
committerDominik Stadler <centic@apache.org>
Sun, 25 Oct 2020 07:21:45 +0000 (07:21 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1882827 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/formula/functions/LookupUtils.java
test-data/spreadsheet/LookupFunctionsTestCaseData.xls

index cccb6d64ad5450b3ba54f212331c440ab84d31cc..9af09c301b6b7292f25668cda40f3b65d8b192a3 100644 (file)
@@ -25,6 +25,7 @@ import org.apache.poi.ss.formula.eval.BlankEval;
 import org.apache.poi.ss.formula.eval.BoolEval;
 import org.apache.poi.ss.formula.eval.ErrorEval;
 import org.apache.poi.ss.formula.eval.EvaluationException;
+import org.apache.poi.ss.formula.eval.MissingArgEval;
 import org.apache.poi.ss.formula.eval.NumberEval;
 import org.apache.poi.ss.formula.eval.NumericValueEval;
 import org.apache.poi.ss.formula.eval.OperandResolver;
@@ -133,7 +134,7 @@ final class LookupUtils {
                return new ColumnVector(tableArray, relativeColumnIndex);
        }
        /**
-        * @return <code>null</code> if the supplied area is neither a single row nor a single colum
+        * @return <code>null</code> if the supplied area is neither a single row nor a single column
         */
        public static ValueVector createVector(TwoDEval ae) {
                if (ae.isColumn()) {
@@ -144,7 +145,7 @@ final class LookupUtils {
                }
                return null;
        }
-       
+
        public static ValueVector createVector(RefEval re) {
            return new SheetVector(re);
        }
@@ -276,11 +277,11 @@ final class LookupUtils {
 
 
     private static final class StringLookupComparer extends LookupValueComparerBase {
-               
-        private String _value;
+
+        private final String _value;
         private final Pattern _wildCardPattern;
-        private boolean _matchExact;
-        private boolean _isMatchFunction;
+        private final boolean _matchExact;
+        private final boolean _isMatchFunction;
 
         protected StringLookupComparer(StringEval se, boolean matchExact, boolean isMatchFunction) {
                        super(se);
@@ -311,7 +312,7 @@ final class LookupUtils {
                }
        }
        private static final class NumberLookupComparer extends LookupValueComparerBase {
-               private double _value;
+               private final double _value;
 
                protected NumberLookupComparer(NumberEval ne) {
                        super(ne);
@@ -326,7 +327,7 @@ final class LookupUtils {
                }
        }
        private static final class BooleanLookupComparer extends LookupValueComparerBase {
-               private boolean _value;
+               private final boolean _value;
 
                protected BooleanLookupComparer(BoolEval be) {
                        super(be);
@@ -434,6 +435,11 @@ final class LookupUtils {
        public static boolean resolveRangeLookupArg(ValueEval rangeLookupArg, int srcCellRow, int srcCellCol) throws EvaluationException {
 
                ValueEval valEval = OperandResolver.getSingleValue(rangeLookupArg, srcCellRow, srcCellCol);
+               if(valEval == MissingArgEval.instance) {
+                       // Tricky:
+                       // forth arg exists but is not supplied: "=VLOOKUP(A1,A2:A4,2,)"
+                       return false;
+               }
                if(valEval instanceof BlankEval) {
                        // Tricky:
                        // fourth arg supplied but evaluates to blank
@@ -457,7 +463,7 @@ final class LookupUtils {
                        Boolean b = Countif.parseBoolean(stringValue);
                        if(b != null) {
                                // string converted to boolean OK
-                               return b.booleanValue();
+                               return b;
                        }
                        // Even more trickiness:
                        // Note - even if the StringEval represents a number value (for example "1"),
index 56b6f12a00bdeff9cccf0b6282209ca4cf1a8b54..d9e9b517d8c69e813445b65ff1160c2dfb7745e0 100644 (file)
Binary files a/test-data/spreadsheet/LookupFunctionsTestCaseData.xls and b/test-data/spreadsheet/LookupFunctionsTestCaseData.xls differ