/* ====================================================================
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
contributor license agreements. See the NOTICE file distributed with
|
this work for Additional information regarding copyright ownership.
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
(the "License"); you may not use this file except in compliance with
|
the License. You may obtain a copy of the License at
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
Unless required by applicable law or agreed to in writing, software
|
distributed under the License is distributed on an "AS IS" BASIS,
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
See the License for the specific language governing permissions and
|
limitations under the License.
|
==================================================================== */
|
|
namespace HH.WMS.Utils.NPOI.SS.Formula.Functions
|
{
|
using HH.WMS.Utils.NPOI.SS.Formula.Eval;
|
using HH.WMS.Utils.NPOI.SS.UserModel;
|
using System;
|
|
/**
|
* Implementation of Excel functions Date parsing functions:
|
* Date - DAY, MONTH and YEAR
|
* Time - HOUR, MINUTE and SECOND
|
*/
|
public class CalendarFieldFunction : Fixed1ArgFunction
|
{
|
public const int YEAR_ID = 0x01;
|
public const int MONTH_ID = 0x02;
|
public const int DAY_OF_MONTH_ID = 0x03;
|
public const int HOUR_OF_DAY_ID = 0x04;
|
public const int MINUTE_ID = 0x05;
|
public const int SECOND_ID = 0x06;
|
|
public static Function YEAR = new CalendarFieldFunction(YEAR_ID);
|
public static Function MONTH = new CalendarFieldFunction(MONTH_ID);
|
public static Function DAY = new CalendarFieldFunction(DAY_OF_MONTH_ID);
|
public static Function HOUR = new CalendarFieldFunction(HOUR_OF_DAY_ID);
|
public static Function MINUTE = new CalendarFieldFunction(MINUTE_ID);
|
public static Function SECOND = new CalendarFieldFunction(SECOND_ID);
|
|
private int _dateFieldId;
|
|
private CalendarFieldFunction(int dateFieldId)
|
{
|
_dateFieldId = dateFieldId;
|
}
|
|
public override ValueEval Evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0)
|
{
|
double val;
|
try
|
{
|
ValueEval ve = OperandResolver.GetSingleValue(arg0, srcRowIndex, srcColumnIndex);
|
val = OperandResolver.CoerceValueToDouble(ve);
|
}
|
catch (EvaluationException e)
|
{
|
return e.GetErrorEval();
|
}
|
if (val < 0)
|
{
|
return ErrorEval.NUM_ERROR;
|
}
|
return new NumberEval(GetCalField(val));
|
}
|
|
private int GetCalField(double serialDate)
|
{
|
if ((int)serialDate == 0)
|
{
|
// Special weird case
|
// day zero should be 31-Dec-1899, but Excel seems to think it is 0-Jan-1900
|
switch (_dateFieldId)
|
{
|
case YEAR_ID: return 1900;
|
case MONTH_ID: return 1;
|
case DAY_OF_MONTH_ID: return 0;
|
}
|
//throw new InvalidOperationException("bad date field " + _dateFieldId);
|
}
|
DateTime d = DateUtil.GetJavaDate(serialDate, false); // TODO fix 1900/1904 problem
|
|
//Calendar c = new GregorianCalendar();
|
//c.setTime(d);
|
int result = 0;
|
if (_dateFieldId == YEAR_ID)
|
{
|
result = d.Year;
|
}
|
else if (_dateFieldId == MONTH_ID)
|
{
|
result = d.Month;
|
}
|
else if (_dateFieldId == DAY_OF_MONTH_ID)
|
{
|
result = d.Day;
|
}
|
else if (_dateFieldId == HOUR_OF_DAY_ID)
|
{
|
result = d.Hour;
|
}
|
else if (_dateFieldId == MINUTE_ID)
|
{
|
result = d.Minute;
|
}
|
else if (_dateFieldId == SECOND_ID)
|
{
|
result = d.Second;
|
}
|
return result;
|
}
|
}
|
}
|