Author: fanningpj
Date: Fri Feb 11 00:12:51 2022
New Revision: 1897953
URL: http://svn.apache.org/viewvc?rev=1897953&view=rev
Log:
[bug-65879] add WORKDAY.INTL function
Added:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayIntlFunction.java
- copied, changed from r1897948,
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java
Modified:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java
Modified:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java?rev=1897953&r1=1897952&r2=1897953&view=diff
==============================================================================
---
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
(original)
+++
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
Fri Feb 11 00:12:51 2022
@@ -184,6 +184,7 @@ public final class AnalysisToolPak imple
r(m, "TEXTJOIN", TextJoinFunction.instance);
r(m, "WEEKNUM", WeekNum.instance);
r(m, "WORKDAY", WorkdayFunction.instance);
+ r(m, "WORKDAY.INTL", WorkdayIntlFunction.instance);
r(m, "XIRR", null);
r(m, "XLOOKUP", XLookupFunction.instance);
r(m, "XMATCH", XMatchFunction.instance);
Modified:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java?rev=1897953&r1=1897952&r2=1897953&view=diff
==============================================================================
---
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java
(original)
+++
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java
Fri Feb 11 00:12:51 2022
@@ -89,6 +89,10 @@ public class WorkdayCalculator {
// enforcing singleton
}
+ public Set<Integer> getValidWeekendTypes() {
+ return weekendTypeMap.keySet();
+ }
+
/**
* Calculate how many workdays are there between a start and an end date,
as excel representations, considering a range of holidays.
*
Modified:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java?rev=1897953&r1=1897952&r2=1897953&view=diff
==============================================================================
---
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java
(original)
+++
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java
Fri Feb 11 00:12:51 2022
@@ -46,8 +46,8 @@ final class WorkdayFunction implements F
}
/**
- * Evaluate for WORKDAY. Given a date, a number of days and a optional
date or interval of holidays, determines which date it is past
- * number of parametrized workdays.
+ * Evaluate for WORKDAY. Given a date, a number of days and an optional
date or interval of holidays, determines which date it is past
+ * number of parameterized workdays.
*
* @return {@link ValueEval} with date as its value.
*/
Copied:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayIntlFunction.java
(from r1897948,
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java)
URL:
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayIntlFunction.java?p2=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayIntlFunction.java&p1=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java&r1=1897948&r2=1897953&rev=1897953&view=diff
==============================================================================
---
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java
(original)
+++
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayIntlFunction.java
Fri Feb 11 00:12:51 2022
@@ -26,33 +26,35 @@ import org.apache.poi.ss.formula.functio
import org.apache.poi.ss.usermodel.DateUtil;
/**
- * Implementation of Excel 'Analysis ToolPak' function WORKDAY()<br>
+ * Implementation of Excel 'Analysis ToolPak' function WORKDAY.INTL()<br>
* Returns the date past a number of workdays beginning at a start date,
considering an interval of holidays. A workday is any non
* saturday/sunday date.
* <p>
* <b>Syntax</b><br>
- * <b>WORKDAY</b>(<b>startDate</b>, <b>days</b>, holidays)
+ * <b>WORKDAY</b>(<b>startDate</b>, <b>days</b>, weekendType, holidays)
* <p>
+ *
https://support.microsoft.com/en-us/office/workday-intl-function-a378391c-9ba7-4678-8a39-39611a9bf81d
*/
-final class WorkdayFunction implements FreeRefFunction {
+final class WorkdayIntlFunction implements FreeRefFunction {
- public static final FreeRefFunction instance = new
WorkdayFunction(ArgumentsEvaluator.instance);
+ public static final FreeRefFunction instance = new
WorkdayIntlFunction(ArgumentsEvaluator.instance);
private ArgumentsEvaluator evaluator;
- private WorkdayFunction(ArgumentsEvaluator anEvaluator) {
+ private WorkdayIntlFunction(ArgumentsEvaluator anEvaluator) {
// enforces singleton
this.evaluator = anEvaluator;
}
/**
- * Evaluate for WORKDAY. Given a date, a number of days and a optional
date or interval of holidays, determines which date it is past
- * number of parametrized workdays.
+ * Evaluate for WORKDAY.INTL. Given a date, a number of days, an optional
weekend type
+ * and an optional date or interval of holidays, determines which date it
is past
+ * number of parameterized workdays.
*
* @return {@link ValueEval} with date as its value.
*/
public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec)
{
- if (args.length < 2 || args.length > 3) {
+ if (args.length < 2 || args.length > 4) {
return ErrorEval.VALUE_INVALID;
}
@@ -61,13 +63,21 @@ final class WorkdayFunction implements F
double start;
int days;
+ int weekendType = 1;
double[] holidays;
try {
start = this.evaluator.evaluateDateArg(args[0], srcCellRow,
srcCellCol);
days = (int) Math.floor(this.evaluator.evaluateNumberArg(args[1],
srcCellRow, srcCellCol));
- ValueEval holidaysCell = args.length == 3 ? args[2] : null;
+ if (args.length >= 3) {
+ weekendType = (int) this.evaluator.evaluateNumberArg(args[2],
srcCellRow, srcCellCol);
+ if
(!WorkdayCalculator.instance.getValidWeekendTypes().contains(weekendType)) {
+ return ErrorEval.NUM_ERROR;
+ }
+ }
+ ValueEval holidaysCell = args.length >= 4 ? args[3] : null;
holidays = this.evaluator.evaluateDatesArg(holidaysCell,
srcCellRow, srcCellCol);
- return new
NumberEval(DateUtil.getExcelDate(WorkdayCalculator.instance.calculateWorkdays(start,
days, holidays)));
+ return new NumberEval(DateUtil.getExcelDate(
+ WorkdayCalculator.instance.calculateWorkdays(start, days,
weekendType, holidays)));
} catch (EvaluationException e) {
return ErrorEval.VALUE_INVALID;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]