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 &lt; wilson at c bio dot msk cc dot org &gt;
-	 */
-	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 &lt; wilson at c bio dot msk cc dot org &gt;
+     */
+    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