ソースを参照

add xmatch test

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1895615 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_5_2_0
PJ Fanning 2年前
コミット
3e3bdd1328

+ 24
- 1
poi/src/main/java/org/apache/poi/ss/formula/functions/LookupUtils.java ファイルの表示

@@ -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);

+ 8
- 4
poi/src/test/java/org/apache/poi/ss/formula/atp/TestXMatchFunction.java ファイルの表示

@@ -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);
}
}


読み込み中…
キャンセル
保存