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 < amolweb at ya hoo dot com >
- *
+ *
*/
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