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 315b769a4..cf88b37a6 100644
--- a/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java
+++ b/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java
@@ -154,6 +154,7 @@ public final class FunctionEval {
retval[124] = TextFunction.FIND;
+ retval[126] = LogicalFunction.ISERR;
retval[127] = LogicalFunction.ISTEXT;
retval[128] = LogicalFunction.ISNUMBER;
retval[129] = LogicalFunction.ISBLANK;
diff --git a/src/java/org/apache/poi/ss/formula/functions/LogicalFunction.java b/src/java/org/apache/poi/ss/formula/functions/LogicalFunction.java
index ef18dab64..c4b3e6718 100644
--- a/src/java/org/apache/poi/ss/formula/functions/LogicalFunction.java
+++ b/src/java/org/apache/poi/ss/formula/functions/LogicalFunction.java
@@ -90,6 +90,27 @@ public abstract class LogicalFunction extends Fixed1ArgFunction {
}
};
+ /**
+ * Implementation of Excel ISERR() function.
+ *
+ * Syntax:
+ * ISERR(value)
+ *
+ * value The value to be tested
+ *
+ * Returns the logical value TRUE if value refers to any error value except
+ * '#N/A'; otherwise, it returns FALSE.
+ */
+ public static final Function ISERR = new LogicalFunction() {
+ @Override
+ protected boolean evaluate(ValueEval arg) {
+ if (arg instanceof ErrorEval) {
+ return arg != ErrorEval.NA;
+ }
+ return false;
+ }
+ };
+
/**
* Implementation for Excel ISNA() function.
*
diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestLogicalFunction.java b/src/testcases/org/apache/poi/ss/formula/functions/TestLogicalFunction.java
new file mode 100644
index 000000000..faafdac3e
--- /dev/null
+++ b/src/testcases/org/apache/poi/ss/formula/functions/TestLogicalFunction.java
@@ -0,0 +1,88 @@
+package org.apache.poi.ss.formula.functions;
+
+import java.io.IOException;
+
+import junit.framework.TestCase;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellValue;
+import org.apache.poi.ss.usermodel.FormulaEvaluator;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.util.CellReference;
+
+/**
+ * LogicalFunction unit tests.
+ */
+public class TestLogicalFunction extends TestCase {
+
+ private FormulaEvaluator evaluator;
+ private Row row3;
+ private Cell cell1;
+ private Cell cell2;
+
+ @Override
+ public void setUp() throws IOException {
+ Workbook wb = new HSSFWorkbook();
+ try {
+ buildWorkbook(wb);
+ } finally {
+ wb.close();
+ }
+ }
+
+ private void buildWorkbook(Workbook wb) {
+ Sheet sh = wb.createSheet();
+ Row row1 = sh.createRow(0);
+ Row row2 = sh.createRow(1);
+ row3 = sh.createRow(2);
+
+ row1.createCell(0, Cell.CELL_TYPE_NUMERIC);
+ row1.createCell(1, Cell.CELL_TYPE_NUMERIC);
+
+ row2.createCell(0, Cell.CELL_TYPE_NUMERIC);
+ row2.createCell(1, Cell.CELL_TYPE_NUMERIC);
+
+ row3.createCell(0);
+ row3.createCell(1);
+
+ CellReference a1 = new CellReference("A1");
+ CellReference a2 = new CellReference("A2");
+ CellReference b1 = new CellReference("B1");
+ CellReference b2 = new CellReference("B2");
+
+ sh.getRow(a1.getRow()).getCell(a1.getCol()).setCellValue(35);
+ sh.getRow(a2.getRow()).getCell(a2.getCol()).setCellValue(0);
+ sh.getRow(b1.getRow()).getCell(b1.getCol()).setCellFormula("A1/A2");
+ sh.getRow(b2.getRow()).getCell(b2.getCol()).setCellFormula("NA()");
+
+ evaluator = wb.getCreationHelper().createFormulaEvaluator();
+ }
+
+ public void testIsErr() {
+ cell1 = row3.createCell(0);
+ cell1.setCellFormula("ISERR(B1)"); // produces #DIV/0!
+ cell2 = row3.createCell(1);
+ cell2.setCellFormula("ISERR(B2)"); // produces #N/A
+
+ CellValue cell1Value = evaluator.evaluate(cell1);
+ CellValue cell2Value = evaluator.evaluate(cell2);
+
+ assertEquals(true, cell1Value.getBooleanValue());
+ assertEquals(false, cell2Value.getBooleanValue());
+ }
+
+ public void testIsError() {
+ cell1 = row3.createCell(0);
+ cell1.setCellFormula("ISERROR(B1)"); // produces #DIV/0!
+ cell2 = row3.createCell(1);
+ cell2.setCellFormula("ISERROR(B2)"); // produces #N/A
+
+ CellValue cell1Value = evaluator.evaluate(cell1);
+ CellValue cell2Value = evaluator.evaluate(cell2);
+
+ assertEquals(true, cell1Value.getBooleanValue());
+ assertEquals(true, cell2Value.getBooleanValue());
+ }
+}