Implement the date function, patch from Pavel
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@579243 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5a56f23398
commit
283e0ba625
@ -14,12 +14,101 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* Created on May 15, 2005
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.apache.poi.hssf.record.formula.functions;
|
package org.apache.poi.hssf.record.formula.functions;
|
||||||
|
|
||||||
public class Date extends NotImplementedFunction {
|
import java.util.Calendar;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.record.formula.eval.Eval;
|
||||||
|
import org.apache.poi.hssf.record.formula.eval.RefEval;
|
||||||
|
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.ValueEval;
|
||||||
|
import org.apache.poi.hssf.record.formula.eval.NumberEval;
|
||||||
|
import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Pavel Krupets (pkrupets at palmtreebusiness dot com)
|
||||||
|
*/
|
||||||
|
public class Date extends NumericFunction {
|
||||||
|
/**
|
||||||
|
* @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) {
|
||||||
|
if (operands.length == 3) {
|
||||||
|
ValueEval ve[] = new ValueEval[3];
|
||||||
|
|
||||||
|
ve[0] = singleOperandEvaluate(operands[0], srcCellRow, srcCellCol);
|
||||||
|
ve[1] = singleOperandEvaluate(operands[1], srcCellRow, srcCellCol);
|
||||||
|
ve[2] = singleOperandEvaluate(operands[2], srcCellRow, srcCellCol);
|
||||||
|
|
||||||
|
if (validValues(ve)) {
|
||||||
|
int year = getYear(ve[0]);
|
||||||
|
int month = (int) ((NumericValueEval) ve[1]).getNumberValue() - 1;
|
||||||
|
int day = (int) ((NumericValueEval) ve[2]).getNumberValue();
|
||||||
|
|
||||||
|
if (year < 0 || month < 0 || day < 0) {
|
||||||
|
return ErrorEval.VALUE_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (year == 1900 && month == Calendar.FEBRUARY && day == 29) {
|
||||||
|
return new NumberEval(60.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (year == 1900) {
|
||||||
|
if ((month == Calendar.JANUARY && day >= 60) ||
|
||||||
|
(month == Calendar.FEBRUARY && day >= 30))
|
||||||
|
{
|
||||||
|
day--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Calendar c = new GregorianCalendar();
|
||||||
|
|
||||||
|
c.set(year, month, day, 0, 0, 0);
|
||||||
|
c.set(Calendar.MILLISECOND, 0);
|
||||||
|
|
||||||
|
return new NumberEval(HSSFDateUtil.getExcelDate(c.getTime()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorEval.VALUE_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getYear(ValueEval ve) {
|
||||||
|
int year = (int) ((NumericValueEval) ve).getNumberValue();
|
||||||
|
|
||||||
|
if (year < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return year < 1900 ? 1900 + year : year;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean validValues(ValueEval[] values) {
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
ValueEval value = values[i];
|
||||||
|
|
||||||
|
if (value instanceof RefEval) {
|
||||||
|
RefEval re = (RefEval) value;
|
||||||
|
ValueEval ive = re.getInnerValueEval();
|
||||||
|
|
||||||
|
if (ive instanceof BlankEval) {
|
||||||
|
value = new NumberEval(0);
|
||||||
|
} else if (ive instanceof NumericValueEval) {
|
||||||
|
value = ive;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(value instanceof NumericValueEval)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user