diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java b/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java index 349557134..01fa4590f 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/Choose.java @@ -17,8 +17,10 @@ package org.apache.poi.hssf.record.formula.functions; +import org.apache.poi.hssf.record.formula.eval.BlankEval; import org.apache.poi.hssf.record.formula.eval.ErrorEval; import org.apache.poi.hssf.record.formula.eval.EvaluationException; +import org.apache.poi.hssf.record.formula.eval.MissingArgEval; import org.apache.poi.hssf.record.formula.eval.OperandResolver; import org.apache.poi.hssf.record.formula.eval.ValueEval; @@ -37,7 +39,11 @@ public final class Choose implements Function { if (ix < 1 || ix >= args.length) { return ErrorEval.VALUE_INVALID; } - return OperandResolver.getSingleValue(args[ix], srcRowIndex, srcColumnIndex); + ValueEval result = OperandResolver.getSingleValue(args[ix], srcRowIndex, srcColumnIndex); + if (result == MissingArgEval.instance) { + return BlankEval.INSTANCE; + } + return result; } catch (EvaluationException e) { return e.getErrorEval(); } diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/If.java b/src/java/org/apache/poi/hssf/record/formula/functions/If.java index 3f7401984..6cdbcd6a1 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/If.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/If.java @@ -17,8 +17,10 @@ package org.apache.poi.hssf.record.formula.functions; +import org.apache.poi.hssf.record.formula.eval.BlankEval; import org.apache.poi.hssf.record.formula.eval.BoolEval; import org.apache.poi.hssf.record.formula.eval.EvaluationException; +import org.apache.poi.hssf.record.formula.eval.MissingArgEval; import org.apache.poi.hssf.record.formula.eval.OperandResolver; import org.apache.poi.hssf.record.formula.eval.ValueEval; @@ -34,7 +36,13 @@ public final class If extends Var2or3ArgFunction { } catch (EvaluationException e) { return e.getErrorEval(); } - return b ? arg1 : BoolEval.FALSE; + if (b) { + if (arg1 == MissingArgEval.instance) { + return BlankEval.INSTANCE; + } + return arg1; + } + return BoolEval.FALSE; } public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1, @@ -45,7 +53,16 @@ public final class If extends Var2or3ArgFunction { } catch (EvaluationException e) { return e.getErrorEval(); } - return b ? arg1 : arg2; + if (b) { + if (arg1 == MissingArgEval.instance) { + return BlankEval.INSTANCE; + } + return arg1; + } + if (arg2 == MissingArgEval.instance) { + return BlankEval.INSTANCE; + } + return arg2; } public static boolean evaluateFirstArg(ValueEval arg, int srcCellRow, int srcCellCol) diff --git a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java index ddd5f5d36..3accf93f3 100644 --- a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java +++ b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java @@ -435,9 +435,6 @@ public final class WorkbookEvaluator { } // logDebug("invoke " + operation + " (nAgs=" + numops + ")"); opResult = OperationEvaluatorFactory.evaluate(optg, ops, ec); - if (opResult == MissingArgEval.instance) { - opResult = BlankEval.INSTANCE; - } } else { opResult = getEvalForPtg(ptg, ec); }