diff --git a/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java b/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java index bf92661089..0824942f37 100644 --- a/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java +++ b/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java @@ -175,6 +175,8 @@ public final class AnalysisToolPak implements UDFFinder { r(m, "SERIESSUM", null); r(m, "SINGLE", Single.instance); r(m, "SQRTPI", Sqrtpi.instance); + r(m, "STDEV.S", Stdevs.instance); + r(m, "STDEV.P", Stdevp.instance); r(m, "SUMIFS", Sumifs.instance); r(m, "SWITCH", Switch.instance); r(m, "TBILLEQ", null); @@ -195,6 +197,8 @@ public final class AnalysisToolPak implements UDFFinder { r(m, "YIELD", null); r(m, "YIELDDISC", null); r(m, "YIELDMAT", null); + r(m, "VAR.S", Vars.instance); + r(m, "VAR.P", Varp.instance); return m; } diff --git a/poi/src/main/java/org/apache/poi/ss/formula/atp/Stdevp.java b/poi/src/main/java/org/apache/poi/ss/formula/atp/Stdevp.java new file mode 100644 index 0000000000..765ea02cb2 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/ss/formula/atp/Stdevp.java @@ -0,0 +1,16 @@ +package org.apache.poi.ss.formula.atp; + +import org.apache.poi.ss.formula.OperationEvaluationContext; +import org.apache.poi.ss.formula.eval.ValueEval; +import org.apache.poi.ss.formula.functions.AggregateFunction; +import org.apache.poi.ss.formula.functions.FreeRefFunction; + +public class Stdevp implements FreeRefFunction { + + public static final Stdevp instance = new Stdevp(); + + @Override + public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { + return AggregateFunction.STDEVP.evaluate(args, ec.getRowIndex(), ec.getColumnIndex()); + } +} diff --git a/poi/src/main/java/org/apache/poi/ss/formula/atp/Stdevs.java b/poi/src/main/java/org/apache/poi/ss/formula/atp/Stdevs.java new file mode 100644 index 0000000000..f2beab15d9 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/ss/formula/atp/Stdevs.java @@ -0,0 +1,16 @@ +package org.apache.poi.ss.formula.atp; + +import org.apache.poi.ss.formula.OperationEvaluationContext; +import org.apache.poi.ss.formula.eval.ValueEval; +import org.apache.poi.ss.formula.functions.AggregateFunction; +import org.apache.poi.ss.formula.functions.FreeRefFunction; + +public class Stdevs implements FreeRefFunction { + + public static final Stdevs instance = new Stdevs(); + + @Override + public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { + return AggregateFunction.STDEV.evaluate(args, ec.getRowIndex(), ec.getColumnIndex()); + } +} diff --git a/poi/src/main/java/org/apache/poi/ss/formula/atp/Varp.java b/poi/src/main/java/org/apache/poi/ss/formula/atp/Varp.java new file mode 100644 index 0000000000..84133665e3 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/ss/formula/atp/Varp.java @@ -0,0 +1,16 @@ +package org.apache.poi.ss.formula.atp; + +import org.apache.poi.ss.formula.OperationEvaluationContext; +import org.apache.poi.ss.formula.eval.ValueEval; +import org.apache.poi.ss.formula.functions.AggregateFunction; +import org.apache.poi.ss.formula.functions.FreeRefFunction; + +public class Varp implements FreeRefFunction { + + public static final Varp instance = new Varp(); + + @Override + public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { + return AggregateFunction.VARP.evaluate(args, ec.getRowIndex(), ec.getColumnIndex()); + } +} diff --git a/poi/src/main/java/org/apache/poi/ss/formula/atp/Vars.java b/poi/src/main/java/org/apache/poi/ss/formula/atp/Vars.java new file mode 100644 index 0000000000..18c4f16273 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/ss/formula/atp/Vars.java @@ -0,0 +1,16 @@ +package org.apache.poi.ss.formula.atp; + +import org.apache.poi.ss.formula.OperationEvaluationContext; +import org.apache.poi.ss.formula.eval.ValueEval; +import org.apache.poi.ss.formula.functions.AggregateFunction; +import org.apache.poi.ss.formula.functions.FreeRefFunction; + +public class Vars implements FreeRefFunction { + + public static final Vars instance = new Vars(); + + @Override + public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { + return AggregateFunction.VAR.evaluate(args, ec.getRowIndex(), ec.getColumnIndex()); + } +} diff --git a/poi/src/test/java/org/apache/poi/ss/formula/functions/TestStdevp.java b/poi/src/test/java/org/apache/poi/ss/formula/functions/TestStdev.java similarity index 83% rename from poi/src/test/java/org/apache/poi/ss/formula/functions/TestStdevp.java rename to poi/src/test/java/org/apache/poi/ss/formula/functions/TestStdev.java index 15ea474bfa..2397ad99fe 100644 --- a/poi/src/test/java/org/apache/poi/ss/formula/functions/TestStdevp.java +++ b/poi/src/test/java/org/apache/poi/ss/formula/functions/TestStdev.java @@ -29,18 +29,22 @@ import static org.apache.poi.ss.util.Utils.addRow; import static org.apache.poi.ss.util.Utils.assertDouble; /** - * Testcase for function STDEVP() + * Testcase for functions: STDEV(), STDEVP(), STDEV.S(), STDEV.P() */ -public class TestStdevp { +public class TestStdev { //https://support.microsoft.com/en-us/office/stdevp-function-1f7c1c88-1bec-4422-8242-e9f7dc8bb195 + //https://support.microsoft.com/en-us/office/stdev-p-function-6e917c05-31a0-496f-ade7-4f4e7462f285 + //https://support.microsoft.com/en-us/office/stdev-s-function-7d69cf97-0c1f-4acf-be27-f3e83904cc23 @Test void testMicrosoftExample1() throws IOException { try (HSSFWorkbook wb = initWorkbook1()) { HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(12); assertDouble(fe, cell, "STDEVP(A3:A12)", 26.0545581424825, 0.00000000001); + assertDouble(fe, cell, "STDEV.P(A3:A12)", 26.0545581424825, 0.00000000001); assertDouble(fe, cell, "STDEV(A3:A12)", 27.4639157198435, 0.00000000001); + assertDouble(fe, cell, "STDEV.S(A3:A12)", 27.4639157198435, 0.00000000001); } } diff --git a/poi/src/test/java/org/apache/poi/ss/formula/functions/TestVar.java b/poi/src/test/java/org/apache/poi/ss/formula/functions/TestVar.java new file mode 100644 index 0000000000..e569a2e468 --- /dev/null +++ b/poi/src/test/java/org/apache/poi/ss/formula/functions/TestVar.java @@ -0,0 +1,67 @@ + +/* ==================================================================== + 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. +==================================================================== */ +package org.apache.poi.ss.formula.functions; + +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.apache.poi.ss.util.Utils.addRow; +import static org.apache.poi.ss.util.Utils.assertDouble; + +/** + * Testcase for functions: VAR.S(), VAR.P() + */ +public class TestVar { + + //https://support.microsoft.com/en-us/office/var-s-function-913633de-136b-449d-813e-65a00b2b990b + //https://support.microsoft.com/en-us/office/var-p-function-73d1285c-108c-4843-ba5d-a51f90656f3a + @Test + void testMicrosoftExample1() throws IOException { + try (HSSFWorkbook wb = initWorkbook1()) { + HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); + HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(12); + assertDouble(fe, cell, "VARP(A3:A12)", 678.84, 0.00000000001); + assertDouble(fe, cell, "VAR.P(A3:A12)", 678.84, 0.00000000001); + assertDouble(fe, cell, "VAR(A3:A12)", 754.27, 0.005); + assertDouble(fe, cell, "VAR.S(A3:A12)", 754.27, 0.005); + } + } + + private HSSFWorkbook initWorkbook1() { + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFSheet sheet = wb.createSheet(); + addRow(sheet, 0, "Data"); + addRow(sheet, 1, "Strength"); + addRow(sheet, 2, 1345); + addRow(sheet, 3, 1301); + addRow(sheet, 4, 1368); + addRow(sheet, 5, 1322); + addRow(sheet, 6, 1310); + addRow(sheet, 7, 1370); + addRow(sheet, 8, 1318); + addRow(sheet, 9, 1350); + addRow(sheet, 10, 1303); + addRow(sheet, 11, 1299); + return wb; + } +}