You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ce...@apache.org on 2020/12/30 21:40:12 UTC

svn commit: r1884959 - in /poi/trunk: src/java/org/apache/poi/ss/formula/eval/ src/java/org/apache/poi/ss/formula/functions/ src/ooxml/testcases/org/apache/poi/xssf/usermodel/ test-data/spreadsheet/

Author: centic
Date: Wed Dec 30 21:40:12 2020
New Revision: 1884959

URL: http://svn.apache.org/viewvc?rev=1884959&view=rev
Log:
Bug 64986: Support missing or blank match_type for function Match

Excel and LibreOffice use the default value in this case

Modified:
    poi/trunk/src/java/org/apache/poi/ss/formula/eval/ErrorEval.java
    poi/trunk/src/java/org/apache/poi/ss/formula/eval/NumericValueEval.java
    poi/trunk/src/java/org/apache/poi/ss/formula/functions/Match.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
    poi/trunk/test-data/spreadsheet/MatchFunctionTestCaseData.xls

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/eval/ErrorEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/eval/ErrorEval.java?rev=1884959&r1=1884958&r2=1884959&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/eval/ErrorEval.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/eval/ErrorEval.java Wed Dec 30 21:40:12 2020
@@ -27,7 +27,7 @@ import org.apache.poi.ss.usermodel.Formu
  */
 public final class ErrorEval implements ValueEval {
     private static final Map<FormulaError,ErrorEval> evals = new HashMap<>();
-    
+
     /** <b>#NULL!</b>  - Intersection of two cell ranges is empty */
     public static final ErrorEval NULL_INTERSECTION = new ErrorEval(FormulaError.NULL);
     /** <b>#DIV/0!</b> - Division by zero */
@@ -65,7 +65,7 @@ public final class ErrorEval implements
     }
 
     /**
-     * Converts error codes to text.  Handles non-standard error codes OK.  
+     * Converts error codes to text.  Handles non-standard error codes OK.
      * For debug/test purposes (and for formatting error messages).
      * @return the String representation of the specified Excel error code.
      */
@@ -77,7 +77,7 @@ public final class ErrorEval implements
         return "~non~std~err(" + errorCode + ")~";
     }
 
-    private FormulaError _error;
+    private final FormulaError _error;
     private ErrorEval(FormulaError error) {
         _error = error;
         evals.put(error, this);

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/eval/NumericValueEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/eval/NumericValueEval.java?rev=1884959&r1=1884958&r2=1884959&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/eval/NumericValueEval.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/eval/NumericValueEval.java Wed Dec 30 21:40:12 2020
@@ -22,9 +22,9 @@ package org.apache.poi.ss.formula.eval;
 
 /**
  * @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
- *  
+ *
  */
 public interface NumericValueEval extends ValueEval {
 
-    public abstract double getNumberValue();
+    double getNumberValue();
 }

Modified: poi/trunk/src/java/org/apache/poi/ss/formula/functions/Match.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/functions/Match.java?rev=1884959&r1=1884958&r2=1884959&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/functions/Match.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/functions/Match.java Wed Dec 30 21:40:12 2020
@@ -18,8 +18,10 @@
 package org.apache.poi.ss.formula.functions;
 
 import org.apache.poi.ss.formula.TwoDEval;
+import org.apache.poi.ss.formula.eval.BlankEval;
 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;
@@ -177,7 +179,12 @@ public final class Match extends Var2or3
 				throw new EvaluationException(ErrorEval.VALUE_INVALID);
 			}
 			// if the string parses as a number, it is OK
-			return d.doubleValue();
+			return d;
+		}
+		if (match_type instanceof MissingArgEval || match_type instanceof BlankEval) {
+			// Excel-Online ignores a missing match-type and
+			// uses the default-value instead
+			return 1;
 		}
 		throw new RuntimeException("Unexpected match_type type (" + match_type.getClass().getName() + ")");
 	}

Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=1884959&r1=1884958&r2=1884959&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Wed Dec 30 21:40:12 2020
@@ -119,7 +119,6 @@ import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.EnumSource;
-import org.junit.jupiter.params.provider.ValueSource;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCalcCell;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
@@ -3638,4 +3637,28 @@ public final class TestXSSFBugs extends
             }
         }
     }
+
+    @Test
+    public void test64986() throws IOException {
+        XSSFWorkbook w = new XSSFWorkbook();
+        XSSFSheet s = w.createSheet();
+        XSSFRow r = s.createRow(0);
+        XSSFCell c = r.createCell(0);
+        c.setCellFormula("MATCH(\"VAL\",B1:B11,)");
+
+        FormulaEvaluator evaluator = w.getCreationHelper().createFormulaEvaluator();
+        CellValue value = evaluator.evaluate(c);
+        assertEquals(CellType.ERROR, value.getCellType());
+        assertEquals(ErrorEval.NA.getErrorCode(), value.getErrorValue());
+
+        // put a value in place so the match should find something
+        Cell val = r.createCell(1);
+        val.setCellValue("VAL");
+
+        // clear and check that now we find a match
+        evaluator.clearAllCachedResultValues();
+        value = evaluator.evaluate(c);
+        assertEquals(CellType.NUMERIC, value.getCellType());
+        assertEquals(1, value.getNumberValue(), 0.01);
+    }
 }

Modified: poi/trunk/test-data/spreadsheet/MatchFunctionTestCaseData.xls
URL: http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/MatchFunctionTestCaseData.xls?rev=1884959&r1=1884958&r2=1884959&view=diff
==============================================================================
Binary files - no diff available.



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org