From: Nick Burch Date: Thu, 23 Jan 2014 16:43:59 +0000 (+0000) Subject: Patch from Detlef Brendle from bug #55873 - Support for COUNTIFS function X-Git-Tag: REL_3_10_FINAL^2~5 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=4405461d5be549c2471f7bd3166902c736c1dfb5;p=poi.git Patch from Detlef Brendle from bug #55873 - Support for COUNTIFS function git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1560736 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java b/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java index 295a056df0..d8d8bfad47 100644 --- a/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java +++ b/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java @@ -164,6 +164,7 @@ public final class AnalysisToolPak implements UDFFinder { r(m, "YIELD", null); r(m, "YIELDDISC", null); r(m, "YIELDMAT", null); + r(m, "COUNTIFS", Countifs.instance); return m; } diff --git a/src/java/org/apache/poi/ss/formula/functions/Countifs.java b/src/java/org/apache/poi/ss/formula/functions/Countifs.java new file mode 100644 index 0000000000..8fdb4249c8 --- /dev/null +++ b/src/java/org/apache/poi/ss/formula/functions/Countifs.java @@ -0,0 +1,56 @@ +/* ==================================================================== + 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.ss.formula.OperationEvaluationContext; +import org.apache.poi.ss.formula.eval.ErrorEval; +import org.apache.poi.ss.formula.eval.NumberEval; +import org.apache.poi.ss.formula.eval.ValueEval; + +/** + * Implementation for the function COUNTIFS + *

+ * Syntax: COUNTIFS(criteria_range1, criteria1, [criteria_range2, criteria2]) + *

+ */ + +public class Countifs implements FreeRefFunction { + public static final FreeRefFunction instance = new Countifs(); + + @Override + public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { + Double result = null; + if (args.length == 0 || args.length % 2 > 0) { + return ErrorEval.VALUE_INVALID; + } + for (int i = 0; i < args.length; ) { + ValueEval firstArg = args[i]; + ValueEval secondArg = args[i + 1]; + i += 2; + NumberEval evaluate = (NumberEval) new Countif().evaluate(new ValueEval[]{firstArg, secondArg}, ec.getRowIndex(), ec.getColumnIndex()); + if (result == null) { + result = evaluate.getNumberValue(); + } else if (evaluate.getNumberValue() < result) { + result = evaluate.getNumberValue(); + } + } + return new NumberEval(result == null ? 0 : result); + } +} + diff --git a/src/testcases/org/apache/poi/ss/formula/functions/CountifsTests.java b/src/testcases/org/apache/poi/ss/formula/functions/CountifsTests.java new file mode 100644 index 0000000000..94a5c86e92 --- /dev/null +++ b/src/testcases/org/apache/poi/ss/formula/functions/CountifsTests.java @@ -0,0 +1,66 @@ +/* ==================================================================== + 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 junit.framework.TestCase; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.formula.atp.AnalysisToolPak; +import org.apache.poi.ss.usermodel.*; + +public class CountifsTests extends TestCase { + + public void testCallFunction() { + HSSFWorkbook workbook = new HSSFWorkbook(); + Sheet sheet = workbook.createSheet("test"); + Row row1 = sheet.createRow(0); + Cell cellA1 = row1.createCell(0, Cell.CELL_TYPE_FORMULA); + Cell cellB1 = row1.createCell(1, Cell.CELL_TYPE_NUMERIC); + Cell cellC1 = row1.createCell(2, Cell.CELL_TYPE_NUMERIC); + Cell cellD1 = row1.createCell(3, Cell.CELL_TYPE_NUMERIC); + Cell cellE1 = row1.createCell(4, Cell.CELL_TYPE_NUMERIC); + cellB1.setCellValue(1); + cellC1.setCellValue(1); + cellD1.setCellValue(2); + cellE1.setCellValue(4); + + cellA1.setCellFormula("COUNTIFS(B1:C1,1, D1:E1,2)"); + FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); + CellValue evaluate = evaluator.evaluate(cellA1); + assertEquals(1.0d, evaluate.getNumberValue()); + } + + public void testCallFunction_invalidArgs() { + HSSFWorkbook workbook = new HSSFWorkbook(); + Sheet sheet = workbook.createSheet("test"); + Row row1 = sheet.createRow(0); + Cell cellA1 = row1.createCell(0, Cell.CELL_TYPE_FORMULA); + cellA1.setCellFormula("COUNTIFS()"); + FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); + CellValue evaluate = evaluator.evaluate(cellA1); + assertEquals(15, evaluate.getErrorValue()); + cellA1.setCellFormula("COUNTIFS(A1:C1)"); + evaluator = workbook.getCreationHelper().createFormulaEvaluator(); + evaluate = evaluator.evaluate(cellA1); + assertEquals(15, evaluate.getErrorValue()); + cellA1.setCellFormula("COUNTIFS(A1:C1,2,2)"); + evaluator = workbook.getCreationHelper().createFormulaEvaluator(); + evaluate = evaluator.evaluate(cellA1); + assertEquals(15, evaluate.getErrorValue()); + } +}