From ac21496af7ec6b8a7a7156c1988928c451aa661f Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Thu, 23 Aug 2007 16:33:36 +0000 Subject: [PATCH] Implementation of Month and Year functions, from Guenter Kickinger (bug #43199) git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@569062 13f79535-47bb-0310-9956-ffa450edef68 --- .../hssf/record/formula/functions/Month.java | 44 ++++++++++++++++- .../hssf/record/formula/functions/Year.java | 47 ++++++++++++++++++- 2 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Month.java b/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Month.java index b4aeafb59b..065c565d14 100644 --- a/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Month.java +++ b/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Month.java @@ -20,6 +20,48 @@ */ package org.apache.poi.hssf.record.formula.functions; -public class Month extends NotImplementedFunction { +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.Eval; +import org.apache.poi.hssf.record.formula.eval.NumberEval; +import org.apache.poi.hssf.record.formula.eval.NumericValueEval; +import org.apache.poi.hssf.record.formula.eval.ValueEval; +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +/** + * + * @author Guenter Kickinger g.kickinger@gmx.net + * + */ +public class Month extends NumericFunction { + + /* (non-Javadoc) + * @see org.apache.poi.hssf.record.formula.functions.Function#evaluate(org.apache.poi.hssf.record.formula.eval.Eval[], int, short) + */ + public Eval evaluate(Eval[] operands, int srcCellRow, short srcCellCol) { + ValueEval retval = null; + + switch (operands.length) { + default: + retval = ErrorEval.VALUE_INVALID; + break; + case 1: + ValueEval ve = singleOperandEvaluate(operands[0], srcCellRow, srcCellCol); + if (ve instanceof NumericValueEval) { + NumericValueEval ne = (NumericValueEval) ve; + if (HSSFDateUtil.isValidExcelDate(ne.getNumberValue())) { + java.util.Date d = HSSFDateUtil.getJavaDate(ne.getNumberValue()); + retval = new NumberEval(d.getMonth()+1); + } else { + retval = ErrorEval.NUM_ERROR; + } + } + else if (ve instanceof BlankEval) { + // do nothing + } else { + retval = ErrorEval.NUM_ERROR; + } + } + return retval; + } } diff --git a/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Year.java b/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Year.java index 9ae576700b..76ea617cc6 100644 --- a/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Year.java +++ b/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Year.java @@ -20,6 +20,49 @@ */ package org.apache.poi.hssf.record.formula.functions; -public class Year extends NotImplementedFunction { +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.Eval; +import org.apache.poi.hssf.record.formula.eval.NumberEval; +import org.apache.poi.hssf.record.formula.eval.NumericValueEval; +import org.apache.poi.hssf.record.formula.eval.ValueEval; +import org.apache.poi.hssf.usermodel.HSSFDateUtil; -} +/** + * + * @author Guenter Kickinger g.kickinger@gmx.net + * + */ + +public class Year extends NumericFunction { + + /* (non-Javadoc) + * @see org.apache.poi.hssf.record.formula.functions.Function#evaluate(org.apache.poi.hssf.record.formula.eval.Eval[], int, short) + */ + public Eval evaluate(Eval[] operands, int srcCellRow, short srcCellCol) { + ValueEval retval = null; + + switch (operands.length) { + default: + retval = ErrorEval.VALUE_INVALID; + break; + case 1: + ValueEval ve = singleOperandEvaluate(operands[0], srcCellRow, srcCellCol); + if (ve instanceof NumericValueEval) { + NumericValueEval ne = (NumericValueEval) ve; + if (HSSFDateUtil.isValidExcelDate(ne.getNumberValue())) { + java.util.Date d = HSSFDateUtil.getJavaDate(ne.getNumberValue()); + retval = new NumberEval(d.getYear()+1900); + } else { + retval = ErrorEval.NUM_ERROR; + } + } + else if (ve instanceof BlankEval) { + // do nothing + } else { + retval = ErrorEval.NUM_ERROR; + } + } + return retval; + } +} \ No newline at end of file