diff --git a/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java b/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java index a3505d448..ef4062e71 100644 --- a/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java +++ b/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java @@ -139,6 +139,7 @@ public final class FunctionEval { retval[73] = CalendarFieldFunction.SECOND; retval[74] = new Now(); // 75: AREAS + retval[75] = new Areas(); retval[76] = new Rows(); retval[77] = new Columns(); retval[FunctionID.OFFSET] = new Offset(); //nominally 78 diff --git a/src/java/org/apache/poi/ss/formula/functions/Areas.java b/src/java/org/apache/poi/ss/formula/functions/Areas.java new file mode 100644 index 000000000..25c3acde2 --- /dev/null +++ b/src/java/org/apache/poi/ss/formula/functions/Areas.java @@ -0,0 +1,35 @@ +package org.apache.poi.ss.formula.functions; + +import org.apache.poi.ss.formula.eval.ErrorEval; +import org.apache.poi.ss.formula.eval.NumberEval; +import org.apache.poi.ss.formula.eval.RefListEval; +import org.apache.poi.ss.formula.eval.ValueEval; +import org.apache.poi.ss.formula.ptg.NumberPtg; + +/** + * Returns the number of areas in a reference. An area is a range of contiguous cells or a single cell. + * + * @author Loopbing (loopbing@gmail.com) + */ +public final class Areas implements Function { + + @Override + public ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) { + if (args.length == 0) { + return ErrorEval.VALUE_INVALID; + } + try { + ValueEval valueEval = args[0]; + int result = 1; + if (valueEval instanceof RefListEval) { + RefListEval refListEval = (RefListEval) valueEval; + result = refListEval.getList().size(); + } + NumberEval numberEval = new NumberEval(new NumberPtg(result)); + return numberEval; + } catch (Exception e) { + return ErrorEval.VALUE_INVALID; + } + + } +} diff --git a/src/testcases/org/apache/poi/ss/formula/functions/AllIndividualFunctionEvaluationTests.java b/src/testcases/org/apache/poi/ss/formula/functions/AllIndividualFunctionEvaluationTests.java index 272c51a39..bbcf2829d 100644 --- a/src/testcases/org/apache/poi/ss/formula/functions/AllIndividualFunctionEvaluationTests.java +++ b/src/testcases/org/apache/poi/ss/formula/functions/AllIndividualFunctionEvaluationTests.java @@ -57,6 +57,7 @@ import org.junit.runners.Suite; TestValue.class, TestXYNumericFunction.class, TestAddress.class, + TestAreas.class, TestClean.class }) public class AllIndividualFunctionEvaluationTests { diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestAreas.java b/src/testcases/org/apache/poi/ss/formula/functions/TestAreas.java new file mode 100644 index 000000000..f2cba4648 --- /dev/null +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestAreas.java @@ -0,0 +1,42 @@ +package org.apache.poi.ss.formula.functions; + +import junit.framework.TestCase; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.formula.eval.ErrorEval; +import org.apache.poi.ss.formula.eval.NumberEval; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.CellValue; + +public final class TestAreas extends TestCase { + + public void testAreas() { + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFCell cell = wb.createSheet().createRow(0).createCell(0); + HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb); + + String formulaText = "AREAS(B1)"; + confirmResult(fe, cell, formulaText,1.0); + + formulaText = "AREAS(B2:D4)"; + confirmResult(fe, cell, formulaText,1.0); + + formulaText = "AREAS((B2:D4,E5,F6:I9))"; + confirmResult(fe, cell, formulaText,3.0); + + formulaText = "AREAS((B2:D4,E5,C3,E4))"; + confirmResult(fe, cell, formulaText,4.0); + + formulaText = "AREAS((I9))"; + confirmResult(fe, cell, formulaText,1.0); + } + + private static void confirmResult(HSSFFormulaEvaluator fe, HSSFCell cell, String formulaText,Double expectedResult) { + cell.setCellFormula(formulaText); + fe.notifyUpdateCell(cell); + CellValue result = fe.evaluate(cell); + assertEquals(result.getCellTypeEnum(), CellType.NUMERIC); + assertEquals(expectedResult, result.getNumberValue()); + } +}