You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2021/05/22 20:56:49 UTC
svn commit: r1890120 [22/43] - in /poi/trunk/poi/src:
main/java/org/apache/poi/ main/java/org/apache/poi/ddf/
main/java/org/apache/poi/extractor/ main/java/org/apache/poi/hpsf/
main/java/org/apache/poi/hssf/ main/java/org/apache/poi/hssf/dev/
main/java...
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/TextFunction.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/TextFunction.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/TextFunction.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/TextFunction.java Sat May 22 20:56:44 2021
@@ -30,59 +30,59 @@ import org.apache.poi.ss.formula.eval.Va
import org.apache.poi.ss.usermodel.DataFormatter;
public abstract class TextFunction implements Function {
- protected static final DataFormatter formatter = new DataFormatter();
+ protected static final DataFormatter formatter = new DataFormatter();
- protected static String evaluateStringArg(ValueEval eval, int srcRow, int srcCol) throws EvaluationException {
- ValueEval ve = OperandResolver.getSingleValue(eval, srcRow, srcCol);
- return OperandResolver.coerceValueToString(ve);
- }
- protected static int evaluateIntArg(ValueEval arg, int srcCellRow, int srcCellCol) throws EvaluationException {
- ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol);
- return OperandResolver.coerceValueToInt(ve);
- }
-
- protected static double evaluateDoubleArg(ValueEval arg, int srcCellRow, int srcCellCol) throws EvaluationException {
- ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol);
- return OperandResolver.coerceValueToDouble(ve);
- }
-
- @Override
- public final ValueEval evaluate(ValueEval[] args, int srcCellRow, int srcCellCol) {
- try {
- return evaluateFunc(args, srcCellRow, srcCellCol);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- }
-
- protected abstract ValueEval evaluateFunc(ValueEval[] args, int srcCellRow, int srcCellCol) throws EvaluationException;
-
- /* ---------------------------------------------------------------------- */
-
- private static abstract class SingleArgTextFunc extends Fixed1ArgFunction {
-
- protected SingleArgTextFunc() {
- // no fields to initialise
- }
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
- String arg;
- try {
- arg = evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- return evaluate(arg);
- }
- protected abstract ValueEval evaluate(String arg);
- }
+ protected static String evaluateStringArg(ValueEval eval, int srcRow, int srcCol) throws EvaluationException {
+ ValueEval ve = OperandResolver.getSingleValue(eval, srcRow, srcCol);
+ return OperandResolver.coerceValueToString(ve);
+ }
+ protected static int evaluateIntArg(ValueEval arg, int srcCellRow, int srcCellCol) throws EvaluationException {
+ ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol);
+ return OperandResolver.coerceValueToInt(ve);
+ }
+
+ protected static double evaluateDoubleArg(ValueEval arg, int srcCellRow, int srcCellCol) throws EvaluationException {
+ ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol);
+ return OperandResolver.coerceValueToDouble(ve);
+ }
+
+ @Override
+ public final ValueEval evaluate(ValueEval[] args, int srcCellRow, int srcCellCol) {
+ try {
+ return evaluateFunc(args, srcCellRow, srcCellCol);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ }
+
+ protected abstract ValueEval evaluateFunc(ValueEval[] args, int srcCellRow, int srcCellCol) throws EvaluationException;
+
+ /* ---------------------------------------------------------------------- */
+
+ private static abstract class SingleArgTextFunc extends Fixed1ArgFunction {
+
+ protected SingleArgTextFunc() {
+ // no fields to initialise
+ }
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
+ String arg;
+ try {
+ arg = evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ return evaluate(arg);
+ }
+ protected abstract ValueEval evaluate(String arg);
+ }
/**
* Returns the character specified by a number.
*/
public static final Function CHAR = new Fixed1ArgFunction() {
@Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
int arg;
try {
arg = evaluateIntArg(arg0, srcRowIndex, srcColumnIndex);
@@ -97,76 +97,76 @@ public abstract class TextFunction imple
}
};
- public static final Function LEN = new SingleArgTextFunc() {
- @Override
- protected ValueEval evaluate(String arg) {
- return new NumberEval(arg.length());
- }
- };
- public static final Function LOWER = new SingleArgTextFunc() {
- @Override
- protected ValueEval evaluate(String arg) {
- return new StringEval(arg.toLowerCase(Locale.ROOT));
- }
- };
- public static final Function UPPER = new SingleArgTextFunc() {
- @Override
- protected ValueEval evaluate(String arg) {
- return new StringEval(arg.toUpperCase(Locale.ROOT));
- }
- };
+ public static final Function LEN = new SingleArgTextFunc() {
+ @Override
+ protected ValueEval evaluate(String arg) {
+ return new NumberEval(arg.length());
+ }
+ };
+ public static final Function LOWER = new SingleArgTextFunc() {
+ @Override
+ protected ValueEval evaluate(String arg) {
+ return new StringEval(arg.toLowerCase(Locale.ROOT));
+ }
+ };
+ public static final Function UPPER = new SingleArgTextFunc() {
+ @Override
+ protected ValueEval evaluate(String arg) {
+ return new StringEval(arg.toUpperCase(Locale.ROOT));
+ }
+ };
- /**
- * Implementation of the PROPER function:
+ /**
+ * Implementation of the PROPER function:
* Normalizes all words (separated by non-word characters) by
* making the first letter upper and the rest lower case.
*
* This is nearly equivalent to toTitleCase if the Java language had it
- */
- public static final Function PROPER = new SingleArgTextFunc() {
- @Override
- protected ValueEval evaluate(String text) {
- StringBuilder sb = new StringBuilder();
- boolean shouldMakeUppercase = true;
- for(final char ch : text.toCharArray()) {
-
- // Note: we are using String.toUpperCase() here on purpose as it handles certain things
- // better than Character.toUpperCase(), e.g. German "scharfes s" is translated
- // to "SS" (i.e. two characters), if uppercased properly!
- if (shouldMakeUppercase) {
- sb.append(String.valueOf(ch).toUpperCase(Locale.ROOT));
- }
- else {
- sb.append(String.valueOf(ch).toLowerCase(Locale.ROOT));
- }
- shouldMakeUppercase = !Character.isLetter(ch);
- }
- return new StringEval(sb.toString());
- }
- };
-
- /**
- * An implementation of the TRIM function:
- * Removes leading and trailing spaces from value if evaluated operand
- * value is string.
- * Author: Manda Wilson < wilson at c bio dot msk cc dot org >
- */
- public static final Function TRIM = new SingleArgTextFunc() {
- @Override
- protected ValueEval evaluate(String arg) {
- return new StringEval(arg.trim());
- }
- };
-
- /**
- * An implementation of the CLEAN function:
- * In Excel, the Clean function removes all non-printable characters from a string.
+ */
+ public static final Function PROPER = new SingleArgTextFunc() {
+ @Override
+ protected ValueEval evaluate(String text) {
+ StringBuilder sb = new StringBuilder();
+ boolean shouldMakeUppercase = true;
+ for(final char ch : text.toCharArray()) {
+
+ // Note: we are using String.toUpperCase() here on purpose as it handles certain things
+ // better than Character.toUpperCase(), e.g. German "scharfes s" is translated
+ // to "SS" (i.e. two characters), if uppercased properly!
+ if (shouldMakeUppercase) {
+ sb.append(String.valueOf(ch).toUpperCase(Locale.ROOT));
+ }
+ else {
+ sb.append(String.valueOf(ch).toLowerCase(Locale.ROOT));
+ }
+ shouldMakeUppercase = !Character.isLetter(ch);
+ }
+ return new StringEval(sb.toString());
+ }
+ };
+
+ /**
+ * An implementation of the TRIM function:
+ * Removes leading and trailing spaces from value if evaluated operand
+ * value is string.
+ * Author: Manda Wilson < wilson at c bio dot msk cc dot org >
+ */
+ public static final Function TRIM = new SingleArgTextFunc() {
+ @Override
+ protected ValueEval evaluate(String arg) {
+ return new StringEval(arg.trim());
+ }
+ };
+
+ /**
+ * An implementation of the CLEAN function:
+ * In Excel, the Clean function removes all non-printable characters from a string.
*
- * Author: Aniket Banerjee(banerjee@google.com)
- */
+ * Author: Aniket Banerjee(banerjee@google.com)
+ */
public static final Function CLEAN = new SingleArgTextFunc() {
@Override
- protected ValueEval evaluate(String arg) {
+ protected ValueEval evaluate(String arg) {
StringBuilder result = new StringBuilder();
for (final char c : arg.toCharArray()) {
if (isPrintable(c)) {
@@ -188,246 +188,246 @@ public abstract class TextFunction imple
* @return whether the character is printable
*/
private boolean isPrintable(char c){
- return c >= 32;
+ return c >= 32;
}
};
/**
- * An implementation of the MID function<br>
- * MID returns a specific number of
- * characters from a text string, starting at the specified position.<p>
- *
- * <b>Syntax</b>:<br> <b>MID</b>(<b>text</b>, <b>start_num</b>,
- * <b>num_chars</b>)<br>
- *
- * Author: Manda Wilson < wilson at c bio dot msk cc dot org >
- */
- public static final Function MID = new Fixed3ArgFunction() {
-
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0,
- ValueEval arg1, ValueEval arg2) {
- String text;
- int startCharNum;
- int numChars;
- try {
- text = evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
- startCharNum = evaluateIntArg(arg1, srcRowIndex, srcColumnIndex);
- numChars = evaluateIntArg(arg2, srcRowIndex, srcColumnIndex);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- int startIx = startCharNum - 1; // convert to zero-based
-
- // Note - for start_num arg, blank/zero causes error(#VALUE!),
- // but for num_chars causes empty string to be returned.
- if (startIx < 0) {
- return ErrorEval.VALUE_INVALID;
- }
- if (numChars < 0) {
- return ErrorEval.VALUE_INVALID;
- }
- int len = text.length();
- if (startIx > len) {
- return new StringEval("");
- }
- int endIx = Math.min(startIx + numChars, len);
- String result = text.substring(startIx, endIx);
- return new StringEval(result);
- }
- };
-
- private static final class LeftRight extends Var1or2ArgFunction {
- private static final ValueEval DEFAULT_ARG1 = new NumberEval(1.0);
- private final boolean _isLeft;
- protected LeftRight(boolean isLeft) {
- _isLeft = isLeft;
- }
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
- return evaluate(srcRowIndex, srcColumnIndex, arg0, DEFAULT_ARG1);
- }
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0,
- ValueEval arg1) {
- String arg;
- int index;
- try {
- arg = evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
- index = evaluateIntArg(arg1, srcRowIndex, srcColumnIndex);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
-
- if(index < 0) {
- return ErrorEval.VALUE_INVALID;
- }
-
- String result;
- if (_isLeft) {
- result = arg.substring(0, Math.min(arg.length(), index));
- } else {
- result = arg.substring(Math.max(0, arg.length()-index));
- }
- return new StringEval(result);
- }
- }
-
- public static final Function LEFT = new LeftRight(true);
- public static final Function RIGHT = new LeftRight(false);
-
- public static final FreeRefFunction CONCAT = (args, ec) -> {
- StringBuilder sb = new StringBuilder();
- for (ValueEval arg : args) {
- try {
- if (arg instanceof AreaEval) {
- AreaEval area = (AreaEval)arg;
- for (int rn=0; rn<area.getHeight(); rn++) {
- for (int cn=0; cn<area.getWidth(); cn++) {
- ValueEval ve = area.getRelativeValue(rn, cn);
- sb.append(evaluateStringArg(ve, ec.getRowIndex(), ec.getColumnIndex()));
- }
- }
- } else {
- sb.append(evaluateStringArg(arg, ec.getRowIndex(), ec.getColumnIndex()));
- }
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- }
- return new StringEval(sb.toString());
- };
-
- public static final Function CONCATENATE = (args, srcRowIndex, srcColumnIndex) -> {
- StringBuilder sb = new StringBuilder();
- for (ValueEval arg : args) {
- try {
- sb.append(evaluateStringArg(arg, srcRowIndex, srcColumnIndex));
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- }
- return new StringEval(sb.toString());
- };
-
- public static final Function EXACT = new Fixed2ArgFunction() {
-
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0,
- ValueEval arg1) {
- String s0;
- String s1;
- try {
- s0 = evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
- s1 = evaluateStringArg(arg1, srcRowIndex, srcColumnIndex);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- return BoolEval.valueOf(s0.equals(s1));
- }
- };
-
- /**
- * An implementation of the TEXT function<br>
- * TEXT returns a number value formatted with the given number formatting string.
- * This function is not a complete implementation of the Excel function, but
- * handles most of the common cases. All work is passed down to
- * {@link DataFormatter} to be done, as this works much the same as the
- * display focused work that that does.
- *
- * <b>Syntax</b>:<br> <b>TEXT</b>(<b>value</b>, <b>format_text</b>)<br>
- */
- public static final Function TEXT = new Fixed2ArgFunction() {
-
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
- double s0;
- String s1;
- try {
- s0 = evaluateDoubleArg(arg0, srcRowIndex, srcColumnIndex);
- s1 = evaluateStringArg(arg1, srcRowIndex, srcColumnIndex);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
+ * An implementation of the MID function<br>
+ * MID returns a specific number of
+ * characters from a text string, starting at the specified position.<p>
+ *
+ * <b>Syntax</b>:<br> <b>MID</b>(<b>text</b>, <b>start_num</b>,
+ * <b>num_chars</b>)<br>
+ *
+ * Author: Manda Wilson < wilson at c bio dot msk cc dot org >
+ */
+ public static final Function MID = new Fixed3ArgFunction() {
+
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0,
+ ValueEval arg1, ValueEval arg2) {
+ String text;
+ int startCharNum;
+ int numChars;
+ try {
+ text = evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
+ startCharNum = evaluateIntArg(arg1, srcRowIndex, srcColumnIndex);
+ numChars = evaluateIntArg(arg2, srcRowIndex, srcColumnIndex);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ int startIx = startCharNum - 1; // convert to zero-based
+
+ // Note - for start_num arg, blank/zero causes error(#VALUE!),
+ // but for num_chars causes empty string to be returned.
+ if (startIx < 0) {
+ return ErrorEval.VALUE_INVALID;
+ }
+ if (numChars < 0) {
+ return ErrorEval.VALUE_INVALID;
+ }
+ int len = text.length();
+ if (startIx > len) {
+ return new StringEval("");
+ }
+ int endIx = Math.min(startIx + numChars, len);
+ String result = text.substring(startIx, endIx);
+ return new StringEval(result);
+ }
+ };
+
+ private static final class LeftRight extends Var1or2ArgFunction {
+ private static final ValueEval DEFAULT_ARG1 = new NumberEval(1.0);
+ private final boolean _isLeft;
+ protected LeftRight(boolean isLeft) {
+ _isLeft = isLeft;
+ }
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
+ return evaluate(srcRowIndex, srcColumnIndex, arg0, DEFAULT_ARG1);
+ }
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0,
+ ValueEval arg1) {
+ String arg;
+ int index;
+ try {
+ arg = evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
+ index = evaluateIntArg(arg1, srcRowIndex, srcColumnIndex);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+
+ if(index < 0) {
+ return ErrorEval.VALUE_INVALID;
+ }
+
+ String result;
+ if (_isLeft) {
+ result = arg.substring(0, Math.min(arg.length(), index));
+ } else {
+ result = arg.substring(Math.max(0, arg.length()-index));
+ }
+ return new StringEval(result);
+ }
+ }
+
+ public static final Function LEFT = new LeftRight(true);
+ public static final Function RIGHT = new LeftRight(false);
- try {
+ public static final FreeRefFunction CONCAT = (args, ec) -> {
+ StringBuilder sb = new StringBuilder();
+ for (ValueEval arg : args) {
+ try {
+ if (arg instanceof AreaEval) {
+ AreaEval area = (AreaEval)arg;
+ for (int rn=0; rn<area.getHeight(); rn++) {
+ for (int cn=0; cn<area.getWidth(); cn++) {
+ ValueEval ve = area.getRelativeValue(rn, cn);
+ sb.append(evaluateStringArg(ve, ec.getRowIndex(), ec.getColumnIndex()));
+ }
+ }
+ } else {
+ sb.append(evaluateStringArg(arg, ec.getRowIndex(), ec.getColumnIndex()));
+ }
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ }
+ return new StringEval(sb.toString());
+ };
+
+ public static final Function CONCATENATE = (args, srcRowIndex, srcColumnIndex) -> {
+ StringBuilder sb = new StringBuilder();
+ for (ValueEval arg : args) {
+ try {
+ sb.append(evaluateStringArg(arg, srcRowIndex, srcColumnIndex));
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ }
+ return new StringEval(sb.toString());
+ };
+
+ public static final Function EXACT = new Fixed2ArgFunction() {
+
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0,
+ ValueEval arg1) {
+ String s0;
+ String s1;
+ try {
+ s0 = evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
+ s1 = evaluateStringArg(arg1, srcRowIndex, srcColumnIndex);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ return BoolEval.valueOf(s0.equals(s1));
+ }
+ };
+
+ /**
+ * An implementation of the TEXT function<br>
+ * TEXT returns a number value formatted with the given number formatting string.
+ * This function is not a complete implementation of the Excel function, but
+ * handles most of the common cases. All work is passed down to
+ * {@link DataFormatter} to be done, as this works much the same as the
+ * display focused work that that does.
+ *
+ * <b>Syntax</b>:<br> <b>TEXT</b>(<b>value</b>, <b>format_text</b>)<br>
+ */
+ public static final Function TEXT = new Fixed2ArgFunction() {
+
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
+ double s0;
+ String s1;
+ try {
+ s0 = evaluateDoubleArg(arg0, srcRowIndex, srcColumnIndex);
+ s1 = evaluateStringArg(arg1, srcRowIndex, srcColumnIndex);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+
+ try {
// Ask DataFormatter to handle the String for us
- String formattedStr = formatter.formatRawCellContents(s0, -1, s1);
- return new StringEval(formattedStr);
- } catch (Exception e) {
- return ErrorEval.VALUE_INVALID;
- }
- }
- };
-
- private static final class SearchFind extends Var2or3ArgFunction {
-
- private final boolean _isCaseSensitive;
-
- public SearchFind(boolean isCaseSensitive) {
- _isCaseSensitive = isCaseSensitive;
- }
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
- try {
- String needle = TextFunction.evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
- String haystack = TextFunction.evaluateStringArg(arg1, srcRowIndex, srcColumnIndex);
- return eval(haystack, needle, 0);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- }
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
- ValueEval arg2) {
- try {
- String needle = TextFunction.evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
- String haystack = TextFunction.evaluateStringArg(arg1, srcRowIndex, srcColumnIndex);
- // evaluate third arg and convert from 1-based to 0-based index
- int startpos = TextFunction.evaluateIntArg(arg2, srcRowIndex, srcColumnIndex) - 1;
- if (startpos < 0) {
- return ErrorEval.VALUE_INVALID;
- }
- return eval(haystack, needle, startpos);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- }
- private ValueEval eval(String haystack, String needle, int startIndex) {
- int result;
- if (_isCaseSensitive) {
- result = haystack.indexOf(needle, startIndex);
- } else {
- result = haystack.toUpperCase(Locale.ROOT)
+ String formattedStr = formatter.formatRawCellContents(s0, -1, s1);
+ return new StringEval(formattedStr);
+ } catch (Exception e) {
+ return ErrorEval.VALUE_INVALID;
+ }
+ }
+ };
+
+ private static final class SearchFind extends Var2or3ArgFunction {
+
+ private final boolean _isCaseSensitive;
+
+ public SearchFind(boolean isCaseSensitive) {
+ _isCaseSensitive = isCaseSensitive;
+ }
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
+ try {
+ String needle = TextFunction.evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
+ String haystack = TextFunction.evaluateStringArg(arg1, srcRowIndex, srcColumnIndex);
+ return eval(haystack, needle, 0);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ }
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
+ ValueEval arg2) {
+ try {
+ String needle = TextFunction.evaluateStringArg(arg0, srcRowIndex, srcColumnIndex);
+ String haystack = TextFunction.evaluateStringArg(arg1, srcRowIndex, srcColumnIndex);
+ // evaluate third arg and convert from 1-based to 0-based index
+ int startpos = TextFunction.evaluateIntArg(arg2, srcRowIndex, srcColumnIndex) - 1;
+ if (startpos < 0) {
+ return ErrorEval.VALUE_INVALID;
+ }
+ return eval(haystack, needle, startpos);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ }
+ private ValueEval eval(String haystack, String needle, int startIndex) {
+ int result;
+ if (_isCaseSensitive) {
+ result = haystack.indexOf(needle, startIndex);
+ } else {
+ result = haystack.toUpperCase(Locale.ROOT)
.indexOf(needle.toUpperCase(Locale.ROOT), startIndex);
- }
- if (result == -1) {
- return ErrorEval.VALUE_INVALID;
- }
- return new NumberEval(result + 1.);
- }
- }
- /**
- * Implementation of the FIND() function.<p>
- *
- * <b>Syntax</b>:<br>
- * <b>FIND</b>(<b>find_text</b>, <b>within_text</b>, start_num)<p>
- *
- * FIND returns the character position of the first (case sensitive) occurrence of
- * {@code find_text} inside {@code within_text}. The third parameter,
- * {@code start_num}, is optional (default=1) and specifies where to start searching
- * from. Character positions are 1-based.<p>
- *
- * Author: Torstein Tauno Svendsen (torstei@officenet.no)
- */
- public static final Function FIND = new SearchFind(true);
- /**
- * Implementation of the FIND() function.<p>
- *
- * <b>Syntax</b>:<br>
- * <b>SEARCH</b>(<b>find_text</b>, <b>within_text</b>, start_num)<p>
- *
- * SEARCH is a case-insensitive version of FIND()
- */
- public static final Function SEARCH = new SearchFind(false);
+ }
+ if (result == -1) {
+ return ErrorEval.VALUE_INVALID;
+ }
+ return new NumberEval(result + 1.);
+ }
+ }
+ /**
+ * Implementation of the FIND() function.<p>
+ *
+ * <b>Syntax</b>:<br>
+ * <b>FIND</b>(<b>find_text</b>, <b>within_text</b>, start_num)<p>
+ *
+ * FIND returns the character position of the first (case sensitive) occurrence of
+ * {@code find_text} inside {@code within_text}. The third parameter,
+ * {@code start_num}, is optional (default=1) and specifies where to start searching
+ * from. Character positions are 1-based.<p>
+ *
+ * Author: Torstein Tauno Svendsen (torstei@officenet.no)
+ */
+ public static final Function FIND = new SearchFind(true);
+ /**
+ * Implementation of the FIND() function.<p>
+ *
+ * <b>Syntax</b>:<br>
+ * <b>SEARCH</b>(<b>find_text</b>, <b>within_text</b>, start_num)<p>
+ *
+ * SEARCH is a case-insensitive version of FIND()
+ */
+ public static final Function SEARCH = new SearchFind(false);
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/TimeFunc.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/TimeFunc.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/TimeFunc.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/TimeFunc.java Sat May 22 20:56:44 2021
@@ -31,55 +31,55 @@ import org.apache.poi.ss.formula.eval.Va
*/
public final class TimeFunc extends Fixed3ArgFunction {
- private static final int SECONDS_PER_MINUTE = 60;
- private static final int SECONDS_PER_HOUR = 3600;
- private static final int HOURS_PER_DAY = 24;
- private static final int SECONDS_PER_DAY = HOURS_PER_DAY * SECONDS_PER_HOUR;
+ private static final int SECONDS_PER_MINUTE = 60;
+ private static final int SECONDS_PER_HOUR = 3600;
+ private static final int HOURS_PER_DAY = 24;
+ private static final int SECONDS_PER_DAY = HOURS_PER_DAY * SECONDS_PER_HOUR;
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
- ValueEval arg2) {
- double result;
- try {
- result = evaluate(evalArg(arg0, srcRowIndex, srcColumnIndex), evalArg(arg1, srcRowIndex, srcColumnIndex), evalArg(arg2, srcRowIndex, srcColumnIndex));
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- return new NumberEval(result);
- }
- private static int evalArg(ValueEval arg, int srcRowIndex, int srcColumnIndex) throws EvaluationException {
- if (arg == MissingArgEval.instance) {
- return 0;
- }
- ValueEval ev = OperandResolver.getSingleValue(arg, srcRowIndex, srcColumnIndex);
- // Excel silently truncates double values to integers
- return OperandResolver.coerceValueToInt(ev);
- }
- /**
- * Converts the supplied hours, minutes and seconds to an Excel time value.
- *
- *
- * @param ds array of 3 doubles containing hours, minutes and seconds.
- * Non-integer inputs are truncated to an integer before further calculation
- * of the time value.
- * @return An Excel representation of a time of day.
- * If the time value represents more than a day, the days are removed from
- * the result, leaving only the time of day component.
- * @throws org.apache.poi.ss.formula.eval.EvaluationException
- * If any of the arguments are greater than 32767 or the hours
- * minutes and seconds when combined form a time value less than 0, the function
- * evaluates to an error.
- */
- private static double evaluate(int hours, int minutes, int seconds) throws EvaluationException {
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
+ ValueEval arg2) {
+ double result;
+ try {
+ result = evaluate(evalArg(arg0, srcRowIndex, srcColumnIndex), evalArg(arg1, srcRowIndex, srcColumnIndex), evalArg(arg2, srcRowIndex, srcColumnIndex));
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ return new NumberEval(result);
+ }
+ private static int evalArg(ValueEval arg, int srcRowIndex, int srcColumnIndex) throws EvaluationException {
+ if (arg == MissingArgEval.instance) {
+ return 0;
+ }
+ ValueEval ev = OperandResolver.getSingleValue(arg, srcRowIndex, srcColumnIndex);
+ // Excel silently truncates double values to integers
+ return OperandResolver.coerceValueToInt(ev);
+ }
+ /**
+ * Converts the supplied hours, minutes and seconds to an Excel time value.
+ *
+ *
+ * @param ds array of 3 doubles containing hours, minutes and seconds.
+ * Non-integer inputs are truncated to an integer before further calculation
+ * of the time value.
+ * @return An Excel representation of a time of day.
+ * If the time value represents more than a day, the days are removed from
+ * the result, leaving only the time of day component.
+ * @throws org.apache.poi.ss.formula.eval.EvaluationException
+ * If any of the arguments are greater than 32767 or the hours
+ * minutes and seconds when combined form a time value less than 0, the function
+ * evaluates to an error.
+ */
+ private static double evaluate(int hours, int minutes, int seconds) throws EvaluationException {
- if (hours > 32767 || minutes > 32767 || seconds > 32767) {
- throw new EvaluationException(ErrorEval.VALUE_INVALID);
- }
- int totalSeconds = hours * SECONDS_PER_HOUR + minutes * SECONDS_PER_MINUTE + seconds;
+ if (hours > 32767 || minutes > 32767 || seconds > 32767) {
+ throw new EvaluationException(ErrorEval.VALUE_INVALID);
+ }
+ int totalSeconds = hours * SECONDS_PER_HOUR + minutes * SECONDS_PER_MINUTE + seconds;
- if (totalSeconds < 0) {
- throw new EvaluationException(ErrorEval.VALUE_INVALID);
- }
- return (totalSeconds % SECONDS_PER_DAY) / (double)SECONDS_PER_DAY;
- }
+ if (totalSeconds < 0) {
+ throw new EvaluationException(ErrorEval.VALUE_INVALID);
+ }
+ return (totalSeconds % SECONDS_PER_DAY) / (double)SECONDS_PER_DAY;
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Today.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Today.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Today.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Today.java Sat May 22 20:56:44 2021
@@ -29,16 +29,16 @@ import org.apache.poi.util.LocaleUtil;
* Implementation of Excel TODAY() Function<br>
*/
public final class Today {
- public static ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
- if (args.length != 0) {
- return ErrorEval.VALUE_INVALID;
- }
- Calendar now = LocaleUtil.getLocaleCalendar();
- now.clear(Calendar.HOUR);
+ public static ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
+ if (args.length != 0) {
+ return ErrorEval.VALUE_INVALID;
+ }
+ Calendar now = LocaleUtil.getLocaleCalendar();
+ now.clear(Calendar.HOUR);
now.set(Calendar.HOUR_OF_DAY,0);
- now.clear(Calendar.MINUTE);
- now.clear(Calendar.SECOND);
- now.clear(Calendar.MILLISECOND);
- return new NumberEval(DateUtil.getExcelDate(now.getTime()));
- }
+ now.clear(Calendar.MINUTE);
+ now.clear(Calendar.SECOND);
+ now.clear(Calendar.MILLISECOND);
+ return new NumberEval(DateUtil.getExcelDate(now.getTime()));
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var1or2ArgFunction.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var1or2ArgFunction.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var1or2ArgFunction.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var1or2ArgFunction.java Sat May 22 20:56:44 2021
@@ -25,13 +25,13 @@ import org.apache.poi.ss.formula.eval.Va
*/
abstract class Var1or2ArgFunction implements Function1Arg, Function2Arg {
- public final ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
- switch (args.length) {
- case 1:
- return evaluate(srcRowIndex, srcColumnIndex, args[0]);
- case 2:
- return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1]);
- }
- return ErrorEval.VALUE_INVALID;
- }
+ public final ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
+ switch (args.length) {
+ case 1:
+ return evaluate(srcRowIndex, srcColumnIndex, args[0]);
+ case 2:
+ return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1]);
+ }
+ return ErrorEval.VALUE_INVALID;
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var2or3ArgFunction.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var2or3ArgFunction.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var2or3ArgFunction.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var2or3ArgFunction.java Sat May 22 20:56:44 2021
@@ -25,13 +25,13 @@ import org.apache.poi.ss.formula.eval.Va
*/
abstract class Var2or3ArgFunction implements Function2Arg, Function3Arg {
- public final ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
- switch (args.length) {
- case 2:
- return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1]);
- case 3:
- return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1], args[2]);
- }
- return ErrorEval.VALUE_INVALID;
- }
+ public final ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
+ switch (args.length) {
+ case 2:
+ return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1]);
+ case 3:
+ return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1], args[2]);
+ }
+ return ErrorEval.VALUE_INVALID;
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var3or4ArgFunction.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var3or4ArgFunction.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var3or4ArgFunction.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Var3or4ArgFunction.java Sat May 22 20:56:44 2021
@@ -25,13 +25,13 @@ import org.apache.poi.ss.formula.eval.Va
*/
abstract class Var3or4ArgFunction implements Function3Arg, Function4Arg {
- public final ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
- switch (args.length) {
- case 3:
- return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1], args[2]);
- case 4:
- return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1], args[2], args[3]);
- }
- return ErrorEval.VALUE_INVALID;
- }
+ public final ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
+ switch (args.length) {
+ case 3:
+ return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1], args[2]);
+ case 4:
+ return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1], args[2], args[3]);
+ }
+ return ErrorEval.VALUE_INVALID;
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Vlookup.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Vlookup.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Vlookup.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Vlookup.java Sat May 22 20:56:44 2021
@@ -38,49 +38,49 @@ import org.apache.poi.ss.formula.TwoDEva
* the lookup_value. If FALSE, only exact matches will be considered<br>
*/
public final class Vlookup extends Var3or4ArgFunction {
- private static final ValueEval DEFAULT_ARG3 = BoolEval.TRUE;
+ private static final ValueEval DEFAULT_ARG3 = BoolEval.TRUE;
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
- ValueEval arg2) {
- return evaluate(srcRowIndex, srcColumnIndex, arg0, arg1, arg2, DEFAULT_ARG3);
- }
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
+ ValueEval arg2) {
+ return evaluate(srcRowIndex, srcColumnIndex, arg0, arg1, arg2, DEFAULT_ARG3);
+ }
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval lookup_value, ValueEval table_array,
- ValueEval col_index, ValueEval range_lookup) {
- try {
- // Evaluation order:
- // lookup_value , table_array, range_lookup, find lookup value, col_index, fetch result
- ValueEval lookupValue = OperandResolver.getSingleValue(lookup_value, srcRowIndex, srcColumnIndex);
- TwoDEval tableArray = LookupUtils.resolveTableArrayArg(table_array);
- boolean isRangeLookup;
- try {
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval lookup_value, ValueEval table_array,
+ ValueEval col_index, ValueEval range_lookup) {
+ try {
+ // Evaluation order:
+ // lookup_value , table_array, range_lookup, find lookup value, col_index, fetch result
+ ValueEval lookupValue = OperandResolver.getSingleValue(lookup_value, srcRowIndex, srcColumnIndex);
+ TwoDEval tableArray = LookupUtils.resolveTableArrayArg(table_array);
+ boolean isRangeLookup;
+ try {
isRangeLookup = LookupUtils.resolveRangeLookupArg(range_lookup, srcRowIndex, srcColumnIndex);
} catch(RuntimeException e) {
isRangeLookup = true;
}
- int rowIndex = LookupUtils.lookupIndexOfValue(lookupValue, LookupUtils.createColumnVector(tableArray, 0), isRangeLookup);
- int colIndex = LookupUtils.resolveRowOrColIndexArg(col_index, srcRowIndex, srcColumnIndex);
- ValueVector resultCol = createResultColumnVector(tableArray, colIndex);
- return resultCol.getItem(rowIndex);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- }
+ int rowIndex = LookupUtils.lookupIndexOfValue(lookupValue, LookupUtils.createColumnVector(tableArray, 0), isRangeLookup);
+ int colIndex = LookupUtils.resolveRowOrColIndexArg(col_index, srcRowIndex, srcColumnIndex);
+ ValueVector resultCol = createResultColumnVector(tableArray, colIndex);
+ return resultCol.getItem(rowIndex);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ }
- /**
- * Returns one column from an {@code AreaEval}
- *
- * @param colIndex assumed to be non-negative
- *
- * @throws EvaluationException (#REF!) if colIndex is too high
- */
- private ValueVector createResultColumnVector(TwoDEval tableArray, int colIndex) throws EvaluationException {
- if(colIndex >= tableArray.getWidth()) {
- throw EvaluationException.invalidRef();
- }
- return LookupUtils.createColumnVector(tableArray, colIndex);
- }
+ /**
+ * Returns one column from an {@code AreaEval}
+ *
+ * @param colIndex assumed to be non-negative
+ *
+ * @throws EvaluationException (#REF!) if colIndex is too high
+ */
+ private ValueVector createResultColumnVector(TwoDEval tableArray, int colIndex) throws EvaluationException {
+ if(colIndex >= tableArray.getWidth()) {
+ throw EvaluationException.invalidRef();
+ }
+ return LookupUtils.createColumnVector(tableArray, colIndex);
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/WeekNum.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/WeekNum.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/WeekNum.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/WeekNum.java Sat May 22 20:56:44 2021
@@ -39,8 +39,8 @@ import org.apache.poi.util.LocaleUtil;
* or as results of other formulas or functions. For example, use DATE(2008,5,23)
* for the 23rd day of May, 2008. Problems can occur if dates are entered as text.
* Return_type is a number that determines on which day the week begins. The default is 1.
- * 1 Week begins on Sunday. Weekdays are numbered 1 through 7.
- * 2 Week begins on Monday. Weekdays are numbered 1 through 7.
+ * 1 Week begins on Sunday. Weekdays are numbered 1 through 7.
+ * 2 Week begins on Monday. Weekdays are numbered 1 through 7.
*/
public class WeekNum extends Fixed2ArgFunction implements FreeRefFunction {
public static final FreeRefFunction instance = new WeekNum();
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/WeekdayFunc.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/WeekdayFunc.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/WeekdayFunc.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/WeekdayFunc.java Sat May 22 20:56:44 2021
@@ -37,92 +37,92 @@ import org.apache.poi.ss.usermodel.DateU
public final class WeekdayFunc implements Function {
//or: extends Var1or2ArgFunction {
- public static final Function instance = new WeekdayFunc();
+ public static final Function instance = new WeekdayFunc();
- private WeekdayFunc() {
- // no fields to initialise
- }
-
- /* for Var1or2ArgFunction:
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
- }
-
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
- }
- */
-
-
- /**
- * Perform WEEKDAY(date, returnOption) function.
- * Note: Parameter texts are from German EXCEL-2010 help.
- * Parameters in args[]:
- * args[0] serialDate
- * EXCEL-date value
- * Standardmaessig ist der 1. Januar 1900 die fortlaufende Zahl 1 und
- * der 1. Januar 2008 die fortlaufende Zahl 39.448, da dieser Tag nach 39.448 Tagen
- * auf den 01.01.1900 folgt.
- * @return Option (optional)
- * Bestimmt den Rueckgabewert:
- 1 oder nicht angegeben Zahl 1 (Sonntag) bis 7 (Samstag). Verhaelt sich wie fruehere Microsoft Excel-Versionen.
- 2 Zahl 1 (Montag) bis 7 (Sonntag).
- 3 Zahl 0 (Montag) bis 6 (Sonntag).
- 11 Die Zahlen 1 (Montag) bis 7 (Sonntag)
- 12 Die Zahlen 1 (Dienstag) bis 7 (Montag)
- 13 Die Zahlen 1 (Mittwoch) bis 7 (Dienstag)
- 14 Die Zahlen 1 (Donnerstag) bis 7 (Mittwoch)
- 15 Die Zahlen 1 (Freitag) bis 7 (Donnerstag)
- 16 Die Zahlen 1 (Samstag) bis 7 (Freitag)
- 17 Die Zahlen 1 (Sonntag) bis 7 (Samstag)
- */
- public ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
- try {
- if (args.length < 1 || args.length > 2) {
- return ErrorEval.VALUE_INVALID;
- }
-
- // extract first parameter
- ValueEval serialDateVE = OperandResolver.getSingleValue(args[0], srcRowIndex, srcColumnIndex);
- double serialDate = OperandResolver.coerceValueToDouble(serialDateVE);
- if (!DateUtil.isValidExcelDate(serialDate)) {
- return ErrorEval.NUM_ERROR; // EXCEL uses this and no VALUE_ERROR
- }
- Calendar date = DateUtil.getJavaCalendar(serialDate, false); // (XXX 1904-windowing not respected)
- int weekday = date.get(Calendar.DAY_OF_WEEK); // => sunday = 1, monday = 2, ..., saturday = 7
-
- // extract second parameter
- int returnOption = 1; // default value
- if (args.length == 2) {
- ValueEval ve = OperandResolver.getSingleValue(args[1], srcRowIndex, srcColumnIndex);
- if (ve == MissingArgEval.instance || ve == BlankEval.instance) {
- return ErrorEval.NUM_ERROR; // EXCEL uses this and no VALUE_ERROR
- }
- returnOption = OperandResolver.coerceValueToInt(ve);
- if (returnOption == 2) {
- returnOption = 11; // both mean the same
- }
- } // if
-
- // perform calculation
- double result;
- if (returnOption == 1) {
- result = weekday;
- // value 2 is handled above (as value 11)
- } else if (returnOption == 3) {
- result = (weekday + 6 - 1) % 7;
- } else if (returnOption >= 11 && returnOption <= 17) {
- // rotate in the value range 1 to 7
- result = (weekday + 6 - (returnOption - 10)) % 7 + 1.;
- } else {
- // EXCEL uses this and no VALUE_ERROR
- return ErrorEval.NUM_ERROR;
- }
-
- return new NumberEval(result);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- } // evaluate()
+ private WeekdayFunc() {
+ // no fields to initialise
+ }
+
+ /* for Var1or2ArgFunction:
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
+ }
+
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
+ }
+ */
+
+
+ /**
+ * Perform WEEKDAY(date, returnOption) function.
+ * Note: Parameter texts are from German EXCEL-2010 help.
+ * Parameters in args[]:
+ * args[0] serialDate
+ * EXCEL-date value
+ * Standardmaessig ist der 1. Januar 1900 die fortlaufende Zahl 1 und
+ * der 1. Januar 2008 die fortlaufende Zahl 39.448, da dieser Tag nach 39.448 Tagen
+ * auf den 01.01.1900 folgt.
+ * @return Option (optional)
+ * Bestimmt den Rueckgabewert:
+ 1 oder nicht angegeben Zahl 1 (Sonntag) bis 7 (Samstag). Verhaelt sich wie fruehere Microsoft Excel-Versionen.
+ 2 Zahl 1 (Montag) bis 7 (Sonntag).
+ 3 Zahl 0 (Montag) bis 6 (Sonntag).
+ 11 Die Zahlen 1 (Montag) bis 7 (Sonntag)
+ 12 Die Zahlen 1 (Dienstag) bis 7 (Montag)
+ 13 Die Zahlen 1 (Mittwoch) bis 7 (Dienstag)
+ 14 Die Zahlen 1 (Donnerstag) bis 7 (Mittwoch)
+ 15 Die Zahlen 1 (Freitag) bis 7 (Donnerstag)
+ 16 Die Zahlen 1 (Samstag) bis 7 (Freitag)
+ 17 Die Zahlen 1 (Sonntag) bis 7 (Samstag)
+ */
+ public ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
+ try {
+ if (args.length < 1 || args.length > 2) {
+ return ErrorEval.VALUE_INVALID;
+ }
+
+ // extract first parameter
+ ValueEval serialDateVE = OperandResolver.getSingleValue(args[0], srcRowIndex, srcColumnIndex);
+ double serialDate = OperandResolver.coerceValueToDouble(serialDateVE);
+ if (!DateUtil.isValidExcelDate(serialDate)) {
+ return ErrorEval.NUM_ERROR; // EXCEL uses this and no VALUE_ERROR
+ }
+ Calendar date = DateUtil.getJavaCalendar(serialDate, false); // (XXX 1904-windowing not respected)
+ int weekday = date.get(Calendar.DAY_OF_WEEK); // => sunday = 1, monday = 2, ..., saturday = 7
+
+ // extract second parameter
+ int returnOption = 1; // default value
+ if (args.length == 2) {
+ ValueEval ve = OperandResolver.getSingleValue(args[1], srcRowIndex, srcColumnIndex);
+ if (ve == MissingArgEval.instance || ve == BlankEval.instance) {
+ return ErrorEval.NUM_ERROR; // EXCEL uses this and no VALUE_ERROR
+ }
+ returnOption = OperandResolver.coerceValueToInt(ve);
+ if (returnOption == 2) {
+ returnOption = 11; // both mean the same
+ }
+ } // if
+
+ // perform calculation
+ double result;
+ if (returnOption == 1) {
+ result = weekday;
+ // value 2 is handled above (as value 11)
+ } else if (returnOption == 3) {
+ result = (weekday + 6 - 1) % 7;
+ } else if (returnOption >= 11 && returnOption <= 17) {
+ // rotate in the value range 1 to 7
+ result = (weekday + 6 - (returnOption - 10)) % 7 + 1.;
+ } else {
+ // EXCEL uses this and no VALUE_ERROR
+ return ErrorEval.NUM_ERROR;
+ }
+
+ return new NumberEval(result);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ } // evaluate()
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/XYNumericFunction.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/XYNumericFunction.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/XYNumericFunction.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/XYNumericFunction.java Sat May 22 20:56:44 2021
@@ -27,158 +27,158 @@ import org.apache.poi.ss.formula.functio
public abstract class XYNumericFunction extends Fixed2ArgFunction {
- private static abstract class ValueArray implements ValueVector {
- private final int _size;
- protected ValueArray(int size) {
- _size = size;
- }
- @Override
+ private static abstract class ValueArray implements ValueVector {
+ private final int _size;
+ protected ValueArray(int size) {
+ _size = size;
+ }
+ @Override
public ValueEval getItem(int index) {
- if (index < 0 || index > _size) {
- throw new IllegalArgumentException("Specified index " + index
- + " is outside range (0.." + (_size - 1) + ")");
- }
- return getItemInternal(index);
- }
- protected abstract ValueEval getItemInternal(int index);
- @Override
- public final int getSize() {
- return _size;
- }
- }
-
- private static final class SingleCellValueArray extends ValueArray {
- private final ValueEval _value;
- public SingleCellValueArray(ValueEval value) {
- super(1);
- _value = value;
- }
- @Override
- protected ValueEval getItemInternal(int index) {
- return _value;
- }
- }
+ if (index < 0 || index > _size) {
+ throw new IllegalArgumentException("Specified index " + index
+ + " is outside range (0.." + (_size - 1) + ")");
+ }
+ return getItemInternal(index);
+ }
+ protected abstract ValueEval getItemInternal(int index);
+ @Override
+ public final int getSize() {
+ return _size;
+ }
+ }
+
+ private static final class SingleCellValueArray extends ValueArray {
+ private final ValueEval _value;
+ public SingleCellValueArray(ValueEval value) {
+ super(1);
+ _value = value;
+ }
+ @Override
+ protected ValueEval getItemInternal(int index) {
+ return _value;
+ }
+ }
- private static final class RefValueArray extends ValueArray {
- private final RefEval _ref;
+ private static final class RefValueArray extends ValueArray {
+ private final RefEval _ref;
private final int _width;
- public RefValueArray(RefEval ref) {
- super(ref.getNumberOfSheets());
- _ref = ref;
- _width = ref.getNumberOfSheets();
- }
- @Override
- protected ValueEval getItemInternal(int index) {
- int sIx = (index % _width) + _ref.getFirstSheetIndex();
- return _ref.getInnerValueEval(sIx);
- }
- }
-
- private static final class AreaValueArray extends ValueArray {
- private final TwoDEval _ae;
- private final int _width;
-
- public AreaValueArray(TwoDEval ae) {
- super(ae.getWidth() * ae.getHeight());
- _ae = ae;
- _width = ae.getWidth();
- }
- @Override
- protected ValueEval getItemInternal(int index) {
- int rowIx = index / _width;
- int colIx = index % _width;
- return _ae.getValue(rowIx, colIx);
- }
- }
-
- protected interface Accumulator {
- double accumulate(double x, double y);
- }
-
- /**
- * Constructs a new instance of the Accumulator used to calculated this function
- */
- protected abstract Accumulator createAccumulator();
-
- @Override
- public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
-
- double result;
- try {
- ValueVector vvX = createValueVector(arg0);
- ValueVector vvY = createValueVector(arg1);
- int size = vvX.getSize();
- if (size == 0 || vvY.getSize() != size) {
- return ErrorEval.NA;
- }
- result = evaluateInternal(vvX, vvY, size);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
- if (Double.isNaN(result) || Double.isInfinite(result)) {
- return ErrorEval.NUM_ERROR;
- }
- return new NumberEval(result);
- }
-
- private double evaluateInternal(ValueVector x, ValueVector y, int size)
- throws EvaluationException {
- Accumulator acc = createAccumulator();
-
- // error handling is as if the x is fully evaluated before y
- ErrorEval firstXerr = null;
- ErrorEval firstYerr = null;
- boolean accumlatedSome = false;
- double result = 0.0;
-
- for (int i = 0; i < size; i++) {
- ValueEval vx = x.getItem(i);
- ValueEval vy = y.getItem(i);
- if (vx instanceof ErrorEval) {
- if (firstXerr == null) {
- firstXerr = (ErrorEval) vx;
- continue;
- }
- }
- if (vy instanceof ErrorEval) {
- if (firstYerr == null) {
- firstYerr = (ErrorEval) vy;
- continue;
- }
- }
- // only count pairs if both elements are numbers
- if (vx instanceof NumberEval && vy instanceof NumberEval) {
- accumlatedSome = true;
- NumberEval nx = (NumberEval) vx;
- NumberEval ny = (NumberEval) vy;
- result += acc.accumulate(nx.getNumberValue(), ny.getNumberValue());
- } else {
- // all other combinations of value types are silently ignored
- }
- }
- if (firstXerr != null) {
- throw new EvaluationException(firstXerr);
- }
- if (firstYerr != null) {
- throw new EvaluationException(firstYerr);
- }
- if (!accumlatedSome) {
- throw new EvaluationException(ErrorEval.DIV_ZERO);
- }
- return result;
- }
-
- private static ValueVector createValueVector(ValueEval arg) throws EvaluationException {
- if (arg instanceof ErrorEval) {
- throw new EvaluationException((ErrorEval) arg);
- }
- if (arg instanceof TwoDEval) {
- return new AreaValueArray((TwoDEval) arg);
- }
- if (arg instanceof RefEval) {
- return new RefValueArray((RefEval) arg);
- }
- return new SingleCellValueArray(arg);
- }
+ public RefValueArray(RefEval ref) {
+ super(ref.getNumberOfSheets());
+ _ref = ref;
+ _width = ref.getNumberOfSheets();
+ }
+ @Override
+ protected ValueEval getItemInternal(int index) {
+ int sIx = (index % _width) + _ref.getFirstSheetIndex();
+ return _ref.getInnerValueEval(sIx);
+ }
+ }
+
+ private static final class AreaValueArray extends ValueArray {
+ private final TwoDEval _ae;
+ private final int _width;
+
+ public AreaValueArray(TwoDEval ae) {
+ super(ae.getWidth() * ae.getHeight());
+ _ae = ae;
+ _width = ae.getWidth();
+ }
+ @Override
+ protected ValueEval getItemInternal(int index) {
+ int rowIx = index / _width;
+ int colIx = index % _width;
+ return _ae.getValue(rowIx, colIx);
+ }
+ }
+
+ protected interface Accumulator {
+ double accumulate(double x, double y);
+ }
+
+ /**
+ * Constructs a new instance of the Accumulator used to calculated this function
+ */
+ protected abstract Accumulator createAccumulator();
+
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
+
+ double result;
+ try {
+ ValueVector vvX = createValueVector(arg0);
+ ValueVector vvY = createValueVector(arg1);
+ int size = vvX.getSize();
+ if (size == 0 || vvY.getSize() != size) {
+ return ErrorEval.NA;
+ }
+ result = evaluateInternal(vvX, vvY, size);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ if (Double.isNaN(result) || Double.isInfinite(result)) {
+ return ErrorEval.NUM_ERROR;
+ }
+ return new NumberEval(result);
+ }
+
+ private double evaluateInternal(ValueVector x, ValueVector y, int size)
+ throws EvaluationException {
+ Accumulator acc = createAccumulator();
+
+ // error handling is as if the x is fully evaluated before y
+ ErrorEval firstXerr = null;
+ ErrorEval firstYerr = null;
+ boolean accumlatedSome = false;
+ double result = 0.0;
+
+ for (int i = 0; i < size; i++) {
+ ValueEval vx = x.getItem(i);
+ ValueEval vy = y.getItem(i);
+ if (vx instanceof ErrorEval) {
+ if (firstXerr == null) {
+ firstXerr = (ErrorEval) vx;
+ continue;
+ }
+ }
+ if (vy instanceof ErrorEval) {
+ if (firstYerr == null) {
+ firstYerr = (ErrorEval) vy;
+ continue;
+ }
+ }
+ // only count pairs if both elements are numbers
+ if (vx instanceof NumberEval && vy instanceof NumberEval) {
+ accumlatedSome = true;
+ NumberEval nx = (NumberEval) vx;
+ NumberEval ny = (NumberEval) vy;
+ result += acc.accumulate(nx.getNumberValue(), ny.getNumberValue());
+ } else {
+ // all other combinations of value types are silently ignored
+ }
+ }
+ if (firstXerr != null) {
+ throw new EvaluationException(firstXerr);
+ }
+ if (firstYerr != null) {
+ throw new EvaluationException(firstYerr);
+ }
+ if (!accumlatedSome) {
+ throw new EvaluationException(ErrorEval.DIV_ZERO);
+ }
+ return result;
+ }
+
+ private static ValueVector createValueVector(ValueEval arg) throws EvaluationException {
+ if (arg instanceof ErrorEval) {
+ throw new EvaluationException((ErrorEval) arg);
+ }
+ if (arg instanceof TwoDEval) {
+ return new AreaValueArray((TwoDEval) arg);
+ }
+ if (arg instanceof RefEval) {
+ return new RefValueArray((RefEval) arg);
+ }
+ return new SingleCellValueArray(arg);
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AddPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AddPtg.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AddPtg.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AddPtg.java Sat May 22 20:56:44 2021
@@ -28,7 +28,7 @@ public final class AddPtg extends ValueO
public static final AddPtg instance = new AddPtg();
private AddPtg() {
- // enforce singleton
+ // enforce singleton
}
@Override
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/Area2DPtgBase.java Sat May 22 20:56:44 2021
@@ -25,34 +25,34 @@ import org.apache.poi.util.LittleEndianO
* Common superclass of 2-D area refs
*/
public abstract class Area2DPtgBase extends AreaPtgBase {
- private static final int SIZE = 9;
+ private static final int SIZE = 9;
- protected Area2DPtgBase(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
- super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
- }
-
- protected Area2DPtgBase(Area2DPtgBase other) {
- super(other);
- }
-
- protected Area2DPtgBase(AreaReference ar) {
- super(ar);
- }
-
- protected Area2DPtgBase(LittleEndianInput in) {
- readCoordinates(in);
- }
-
- public final void write(LittleEndianOutput out) {
- out.writeByte(getSid() + getPtgClass());
- writeCoordinates(out);
- }
-
- public final int getSize() {
- return SIZE;
- }
-
- public final String toFormulaString() {
- return formatReferenceAsString();
- }
+ protected Area2DPtgBase(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
+ super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
+ }
+
+ protected Area2DPtgBase(Area2DPtgBase other) {
+ super(other);
+ }
+
+ protected Area2DPtgBase(AreaReference ar) {
+ super(ar);
+ }
+
+ protected Area2DPtgBase(LittleEndianInput in) {
+ readCoordinates(in);
+ }
+
+ public final void write(LittleEndianOutput out) {
+ out.writeByte(getSid() + getPtgClass());
+ writeCoordinates(out);
+ }
+
+ public final int getSize() {
+ return SIZE;
+ }
+
+ public final String toFormulaString() {
+ return formatReferenceAsString();
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/Area3DPtg.java Sat May 22 20:56:44 2021
@@ -37,89 +37,89 @@ import org.apache.poi.util.LittleEndianO
* The XSSF equivalent is {@link Area3DPxg}
*/
public final class Area3DPtg extends AreaPtgBase implements WorkbookDependentFormula, ExternSheetReferenceToken {
- public static final byte sid = 0x3b;
- private static final int SIZE = 11; // 10 + 1 for Ptg
+ public static final byte sid = 0x3b;
+ private static final int SIZE = 11; // 10 + 1 for Ptg
- private int field_1_index_extern_sheet;
+ private int field_1_index_extern_sheet;
- public Area3DPtg(String arearef, int externIdx) {
- super(new AreaReference(arearef, SpreadsheetVersion.EXCEL97));
- setExternSheetIndex(externIdx);
- }
-
- public Area3DPtg(Area3DPtg other) {
- super(other);
- field_1_index_extern_sheet = other.field_1_index_extern_sheet;
- }
-
- public Area3DPtg(LittleEndianInput in) {
- field_1_index_extern_sheet = in.readShort();
- readCoordinates(in);
- }
-
- public Area3DPtg(int firstRow, int lastRow, int firstColumn, int lastColumn,
- boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative,
- int externalSheetIndex) {
- super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
- setExternSheetIndex(externalSheetIndex);
- }
-
- public Area3DPtg(AreaReference arearef, int externIdx) {
- super(arearef);
- setExternSheetIndex(externIdx);
- }
-
- @Override
- public void write(LittleEndianOutput out) {
- out.writeByte(sid + getPtgClass());
- out.writeShort(field_1_index_extern_sheet);
- writeCoordinates(out);
- }
-
- @Override
- public byte getSid() {
- return sid;
- }
-
- @Override
- public int getSize() {
- return SIZE;
- }
-
- public int getExternSheetIndex() {
- return field_1_index_extern_sheet;
- }
-
- public void setExternSheetIndex(int index) {
- field_1_index_extern_sheet = index;
- }
- public String format2DRefAsString() {
- return formatReferenceAsString();
- }
- /**
- * @return text representation of this area reference that can be used in text
- * formulas. The sheet name will get properly delimited if required.
- */
- public String toFormulaString(FormulaRenderingWorkbook book) {
- return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet, formatReferenceAsString());
- }
-
- @Override
- public String toFormulaString() {
- throw new RuntimeException("3D references need a workbook to determine formula text");
- }
-
- @Override
- public Area3DPtg copy() {
- return new Area3DPtg(this);
- }
-
- @Override
- public Map<String, Supplier<?>> getGenericProperties() {
- return GenericRecordUtil.getGenericProperties(
- "base", super::getGenericProperties,
- "externSheetIndex", this::getExternSheetIndex
- );
- }
+ public Area3DPtg(String arearef, int externIdx) {
+ super(new AreaReference(arearef, SpreadsheetVersion.EXCEL97));
+ setExternSheetIndex(externIdx);
+ }
+
+ public Area3DPtg(Area3DPtg other) {
+ super(other);
+ field_1_index_extern_sheet = other.field_1_index_extern_sheet;
+ }
+
+ public Area3DPtg(LittleEndianInput in) {
+ field_1_index_extern_sheet = in.readShort();
+ readCoordinates(in);
+ }
+
+ public Area3DPtg(int firstRow, int lastRow, int firstColumn, int lastColumn,
+ boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative,
+ int externalSheetIndex) {
+ super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
+ setExternSheetIndex(externalSheetIndex);
+ }
+
+ public Area3DPtg(AreaReference arearef, int externIdx) {
+ super(arearef);
+ setExternSheetIndex(externIdx);
+ }
+
+ @Override
+ public void write(LittleEndianOutput out) {
+ out.writeByte(sid + getPtgClass());
+ out.writeShort(field_1_index_extern_sheet);
+ writeCoordinates(out);
+ }
+
+ @Override
+ public byte getSid() {
+ return sid;
+ }
+
+ @Override
+ public int getSize() {
+ return SIZE;
+ }
+
+ public int getExternSheetIndex() {
+ return field_1_index_extern_sheet;
+ }
+
+ public void setExternSheetIndex(int index) {
+ field_1_index_extern_sheet = index;
+ }
+ public String format2DRefAsString() {
+ return formatReferenceAsString();
+ }
+ /**
+ * @return text representation of this area reference that can be used in text
+ * formulas. The sheet name will get properly delimited if required.
+ */
+ public String toFormulaString(FormulaRenderingWorkbook book) {
+ return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet, formatReferenceAsString());
+ }
+
+ @Override
+ public String toFormulaString() {
+ throw new RuntimeException("3D references need a workbook to determine formula text");
+ }
+
+ @Override
+ public Area3DPtg copy() {
+ return new Area3DPtg(this);
+ }
+
+ @Override
+ public Map<String, Supplier<?>> getGenericProperties() {
+ return GenericRecordUtil.getGenericProperties(
+ "base", super::getGenericProperties,
+ "externSheetIndex", this::getExternSheetIndex
+ );
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaErrPtg.java Sat May 22 20:56:44 2021
@@ -29,56 +29,56 @@ import org.apache.poi.util.LittleEndianO
* AreaErr - handles deleted cell area references.
*/
public final class AreaErrPtg extends OperandPtg {
- public static final byte sid = 0x2B;
- private final int unused1;
- private final int unused2;
-
- public AreaErrPtg() {
- unused1 = 0;
- unused2 = 0;
- }
-
- public AreaErrPtg(LittleEndianInput in) {
- // 8 bytes unused:
- unused1 = in.readInt();
- unused2 = in.readInt();
- }
-
- public void write(LittleEndianOutput out) {
- out.writeByte(sid + getPtgClass());
- out.writeInt(unused1);
- out.writeInt(unused2);
- }
-
- public String toFormulaString() {
- return FormulaError.REF.getString();
- }
+ public static final byte sid = 0x2B;
+ private final int unused1;
+ private final int unused2;
+
+ public AreaErrPtg() {
+ unused1 = 0;
+ unused2 = 0;
+ }
+
+ public AreaErrPtg(LittleEndianInput in) {
+ // 8 bytes unused:
+ unused1 = in.readInt();
+ unused2 = in.readInt();
+ }
+
+ public void write(LittleEndianOutput out) {
+ out.writeByte(sid + getPtgClass());
+ out.writeInt(unused1);
+ out.writeInt(unused2);
+ }
+
+ public String toFormulaString() {
+ return FormulaError.REF.getString();
+ }
- @Override
+ @Override
public byte getDefaultOperandClass() {
- return Ptg.CLASS_REF;
- }
+ return Ptg.CLASS_REF;
+ }
- @Override
- public byte getSid() {
- return sid;
- }
-
- public int getSize() {
- return 9;
- }
-
- @Override
- public AreaErrPtg copy() {
- // immutable
- return this;
- }
-
- @Override
- public Map<String, Supplier<?>> getGenericProperties() {
- return GenericRecordUtil.getGenericProperties(
- "unused1", () -> unused1,
- "unused2", () -> unused2
- );
- }
+ @Override
+ public byte getSid() {
+ return sid;
+ }
+
+ public int getSize() {
+ return 9;
+ }
+
+ @Override
+ public AreaErrPtg copy() {
+ // immutable
+ return this;
+ }
+
+ @Override
+ public Map<String, Supplier<?>> getGenericProperties() {
+ return GenericRecordUtil.getGenericProperties(
+ "unused1", () -> unused1,
+ "unused2", () -> unused2
+ );
+ }
}
\ No newline at end of file
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaI.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaI.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaI.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaI.java Sat May 22 20:56:44 2021
@@ -21,55 +21,55 @@ package org.apache.poi.ss.formula.ptg;
* Common interface for AreaPtg and Area3DPtg, and their child classes.
*/
public interface AreaI {
- /**
- * @return the first row in the area
- */
- int getFirstRow();
-
- /**
- * @return last row in the range (x2 in x1,y1-x2,y2)
- */
- int getLastRow();
-
- /**
- * @return the first column number in the area.
- */
- int getFirstColumn();
-
- /**
- * @return lastcolumn in the area
- */
- int getLastColumn();
-
- class OffsetArea implements AreaI {
-
- private final int _firstColumn;
- private final int _firstRow;
- private final int _lastColumn;
- private final int _lastRow;
-
- public OffsetArea(int baseRow, int baseColumn, int relFirstRowIx, int relLastRowIx,
- int relFirstColIx, int relLastColIx) {
- _firstRow = baseRow + Math.min(relFirstRowIx, relLastRowIx);
- _lastRow = baseRow + Math.max(relFirstRowIx, relLastRowIx);
- _firstColumn = baseColumn + Math.min(relFirstColIx, relLastColIx);
- _lastColumn = baseColumn + Math.max(relFirstColIx, relLastColIx);
- }
-
- public int getFirstColumn() {
- return _firstColumn;
- }
-
- public int getFirstRow() {
- return _firstRow;
- }
-
- public int getLastColumn() {
- return _lastColumn;
- }
-
- public int getLastRow() {
- return _lastRow;
- }
- }
+ /**
+ * @return the first row in the area
+ */
+ int getFirstRow();
+
+ /**
+ * @return last row in the range (x2 in x1,y1-x2,y2)
+ */
+ int getLastRow();
+
+ /**
+ * @return the first column number in the area.
+ */
+ int getFirstColumn();
+
+ /**
+ * @return lastcolumn in the area
+ */
+ int getLastColumn();
+
+ class OffsetArea implements AreaI {
+
+ private final int _firstColumn;
+ private final int _firstRow;
+ private final int _lastColumn;
+ private final int _lastRow;
+
+ public OffsetArea(int baseRow, int baseColumn, int relFirstRowIx, int relLastRowIx,
+ int relFirstColIx, int relLastColIx) {
+ _firstRow = baseRow + Math.min(relFirstRowIx, relLastRowIx);
+ _lastRow = baseRow + Math.max(relFirstRowIx, relLastRowIx);
+ _firstColumn = baseColumn + Math.min(relFirstColIx, relLastColIx);
+ _lastColumn = baseColumn + Math.max(relFirstColIx, relLastColIx);
+ }
+
+ public int getFirstColumn() {
+ return _firstColumn;
+ }
+
+ public int getFirstRow() {
+ return _firstRow;
+ }
+
+ public int getLastColumn() {
+ return _lastColumn;
+ }
+
+ public int getLastRow() {
+ return _lastRow;
+ }
+ }
}
\ No newline at end of file
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaNPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaNPtg.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaNPtg.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaNPtg.java Sat May 22 20:56:44 2021
@@ -23,23 +23,23 @@ import org.apache.poi.util.LittleEndianI
* Specifies a rectangular area of cells A1:A4 for instance.
*/
public final class AreaNPtg extends Area2DPtgBase {
- public static final short sid = 0x2D;
+ public static final short sid = 0x2D;
- public AreaNPtg(AreaNPtg other) {
- super(other);
- }
+ public AreaNPtg(AreaNPtg other) {
+ super(other);
+ }
- public AreaNPtg(LittleEndianInput in) {
- super(in);
- }
+ public AreaNPtg(LittleEndianInput in) {
+ super(in);
+ }
- @Override
- public byte getSid() {
- return sid;
- }
+ @Override
+ public byte getSid() {
+ return sid;
+ }
- @Override
- public AreaNPtg copy() {
- return new AreaNPtg(this);
- }
+ @Override
+ public AreaNPtg copy() {
+ return new AreaNPtg(this);
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaPtg.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaPtg.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/AreaPtg.java Sat May 22 20:56:44 2021
@@ -24,31 +24,31 @@ import org.apache.poi.util.LittleEndianI
* Specifies a rectangular area of cells A1:A4 for instance.
*/
public final class AreaPtg extends Area2DPtgBase {
- public static final short sid = 0x25;
+ public static final short sid = 0x25;
- public AreaPtg(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
- super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
- }
-
- public AreaPtg(AreaPtg other) {
- super(other);
- }
-
- public AreaPtg(LittleEndianInput in) {
- super(in);
- }
+ public AreaPtg(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
+ super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
+ }
+
+ public AreaPtg(AreaPtg other) {
+ super(other);
+ }
+
+ public AreaPtg(LittleEndianInput in) {
+ super(in);
+ }
public AreaPtg(AreaReference arearef) {
super(arearef);
}
- @Override
- public byte getSid() {
- return sid;
- }
-
- @Override
- public AreaPtg copy() {
- return new AreaPtg(this);
- }
+ @Override
+ public byte getSid() {
+ return sid;
+ }
+
+ @Override
+ public AreaPtg copy() {
+ return new AreaPtg(this);
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/ArrayInitialPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/ArrayInitialPtg.java?rev=1890120&r1=1890119&r2=1890120&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/ArrayInitialPtg.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/ptg/ArrayInitialPtg.java Sat May 22 20:56:44 2021
@@ -32,74 +32,74 @@ import org.apache.poi.util.LittleEndianO
* {@link #finishReading(LittleEndianInput)} method.
*/
final class ArrayInitialPtg extends Ptg {
- private final int _reserved0;
- private final int _reserved1;
- private final int _reserved2;
-
- public ArrayInitialPtg(LittleEndianInput in) {
- _reserved0 = in.readInt();
- _reserved1 = in.readUShort();
- _reserved2 = in.readUByte();
- }
- private static RuntimeException invalid() {
- throw new IllegalStateException("This object is a partially initialised tArray, and cannot be used as a Ptg");
- }
- @Override
+ private final int _reserved0;
+ private final int _reserved1;
+ private final int _reserved2;
+
+ public ArrayInitialPtg(LittleEndianInput in) {
+ _reserved0 = in.readInt();
+ _reserved1 = in.readUShort();
+ _reserved2 = in.readUByte();
+ }
+ private static RuntimeException invalid() {
+ throw new IllegalStateException("This object is a partially initialised tArray, and cannot be used as a Ptg");
+ }
+ @Override
public byte getDefaultOperandClass() {
- throw invalid();
- }
- public int getSize() {
- return ArrayPtg.PLAIN_TOKEN_SIZE;
- }
- @Override
- public boolean isBaseToken() {
- return false;
- }
- public String toFormulaString() {
- throw invalid();
- }
- public void write(LittleEndianOutput out) {
- throw invalid();
- }
- /**
- * Read in the actual token (array) values. This occurs
- * AFTER the last Ptg in the expression.
- * See page 304-305 of Excel97-2007BinaryFileFormat(xls)Specification.pdf
- */
- public ArrayPtg finishReading(LittleEndianInput in) {
- int nColumns = in.readUByte();
- short nRows = in.readShort();
- //The token_1_columns and token_2_rows do not follow the documentation.
- //The number of physical rows and columns is actually +1 of these values.
- //Which is not explicitly documented.
- nColumns++;
- nRows++;
-
- int totalCount = nRows * nColumns;
- Object[] arrayValues = ConstantValueParser.parse(in, totalCount);
-
- ArrayPtg result = new ArrayPtg(_reserved0, _reserved1, _reserved2, nColumns, nRows, arrayValues);
- result.setClass(getPtgClass());
- return result;
- }
-
- @Override
- public ArrayInitialPtg copy() {
- // immutable
- return this;
- }
-
- @Override
- public Map<String, Supplier<?>> getGenericProperties() {
- return GenericRecordUtil.getGenericProperties(
- "reserved0", () -> _reserved0,
- "reserved1", () -> _reserved1,
- "reserved2", () -> _reserved2
- );
- }
-
- @Override
- public byte getSid() {
- return -1;
- }
+ throw invalid();
+ }
+ public int getSize() {
+ return ArrayPtg.PLAIN_TOKEN_SIZE;
+ }
+ @Override
+ public boolean isBaseToken() {
+ return false;
+ }
+ public String toFormulaString() {
+ throw invalid();
+ }
+ public void write(LittleEndianOutput out) {
+ throw invalid();
+ }
+ /**
+ * Read in the actual token (array) values. This occurs
+ * AFTER the last Ptg in the expression.
+ * See page 304-305 of Excel97-2007BinaryFileFormat(xls)Specification.pdf
+ */
+ public ArrayPtg finishReading(LittleEndianInput in) {
+ int nColumns = in.readUByte();
+ short nRows = in.readShort();
+ //The token_1_columns and token_2_rows do not follow the documentation.
+ //The number of physical rows and columns is actually +1 of these values.
+ //Which is not explicitly documented.
+ nColumns++;
+ nRows++;
+
+ int totalCount = nRows * nColumns;
+ Object[] arrayValues = ConstantValueParser.parse(in, totalCount);
+
+ ArrayPtg result = new ArrayPtg(_reserved0, _reserved1, _reserved2, nColumns, nRows, arrayValues);
+ result.setClass(getPtgClass());
+ return result;
+ }
+
+ @Override
+ public ArrayInitialPtg copy() {
+ // immutable
+ return this;
+ }
+
+ @Override
+ public Map<String, Supplier<?>> getGenericProperties() {
+ return GenericRecordUtil.getGenericProperties(
+ "reserved0", () -> _reserved0,
+ "reserved1", () -> _reserved1,
+ "reserved2", () -> _reserved2
+ );
+ }
+
+ @Override
+ public byte getSid() {
+ return -1;
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org