git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1895615 13f79535-47bb-0310-9956-ffa450edef68tags/REL_5_2_0
@@ -623,7 +623,30 @@ public final class LookupUtils { | |||
} | |||
public static int xlookupIndexOfValue(ValueEval lookupValue, ValueVector vector, MatchMode matchMode, SearchMode searchMode) throws EvaluationException { | |||
LookupValueComparer lookupComparer = createTolerantLookupComparer(lookupValue, matchMode != MatchMode.WildcardMatch, true); | |||
ValueEval modifiedLookup = lookupValue; | |||
if (lookupValue instanceof StringEval && | |||
(matchMode == MatchMode.ExactMatchFallbackToLargerValue || matchMode == MatchMode.ExactMatchFallbackToSmallerValue)) { | |||
String lookupText = ((StringEval)lookupValue).getStringValue(); | |||
StringBuilder sb = new StringBuilder(lookupText.length()); | |||
boolean containsWildcard = false; | |||
for (char c : lookupText.toCharArray()) { | |||
switch (c) { | |||
case '~': | |||
case '?': | |||
case '*': | |||
containsWildcard = true; | |||
break; | |||
default: | |||
sb.append(c); | |||
} | |||
if (containsWildcard) | |||
break; | |||
} | |||
if (containsWildcard) { | |||
modifiedLookup = new StringEval(sb.toString()); | |||
} | |||
} | |||
LookupValueComparer lookupComparer = createTolerantLookupComparer(modifiedLookup, matchMode != MatchMode.WildcardMatch, true); | |||
int result; | |||
if (searchMode == SearchMode.BinarySearchForward) { | |||
result = binarySearchIndexOfValue(lookupComparer, vector, matchMode, false); |
@@ -21,12 +21,12 @@ import org.apache.poi.hssf.usermodel.HSSFCell; | |||
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; | |||
import org.apache.poi.hssf.usermodel.HSSFSheet; | |||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||
import org.apache.poi.ss.usermodel.FormulaError; | |||
import org.junit.jupiter.api.Test; | |||
import java.io.IOException; | |||
import static org.apache.poi.ss.util.Utils.addRow; | |||
import static org.apache.poi.ss.util.Utils.assertDouble; | |||
import static org.apache.poi.ss.util.Utils.*; | |||
/** | |||
* Testcase for function XMATCH() | |||
@@ -40,16 +40,20 @@ public class TestXMatchFunction { | |||
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); | |||
HSSFCell cell = wb.getSheetAt(0).getRow(2).createCell(5); | |||
assertDouble(fe, cell, "XMATCH(E3,C3:C7)", 2); | |||
assertError(fe, cell, "XMATCH(\"Gra\",C3:C7)", FormulaError.NA); | |||
} | |||
} | |||
@Test | |||
void testMicrosoftExample1() throws IOException { | |||
try (HSSFWorkbook wb = initWorkbook("Gra")) { | |||
try (HSSFWorkbook wb = initWorkbook("Gra?")) { | |||
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); | |||
HSSFCell cell = wb.getSheetAt(0).getRow(2).createCell(5); | |||
//TODO investigate issue with `Gra?` | |||
assertDouble(fe, cell, "XMATCH(E3,C3:C7,1)", 2); | |||
assertDouble(fe, cell, "XMATCH(E3,C3:C7,-1)", 5); | |||
assertDouble(fe, cell, "XMATCH(\"Gra\",C3:C7,1)", 2); | |||
assertDouble(fe, cell, "XMATCH(\"Graz\",C3:C7,1)", 3); | |||
assertDouble(fe, cell, "XMATCH(\"Graz\",C3:C7,-1)", 2); | |||
} | |||
} | |||