]> source.dussan.org Git - poi.git/commitdiff
Fix for bug 45334 - added impl for ERROR.TYPE()
authorJosh Micich <josh@apache.org>
Thu, 3 Jul 2008 23:09:08 +0000 (23:09 +0000)
committerJosh Micich <josh@apache.org>
Thu, 3 Jul 2008 23:09:08 +0000 (23:09 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@673863 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/record/formula/functions/Errortype.java
src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls

index 51268c9aa0b6e18f45f38e06cd9ae52c4e8efbad..dd72eb5c7924fdf548628ff6892d209a16b709f9 100644 (file)
@@ -1,25 +1,78 @@
-/*
-* 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.
-*/
-/*
- * Created on May 15, 2005
- *
- */
+/* ====================================================================
+   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.hssf.record.formula.functions;
 
-public class Errortype extends NotImplementedFunction {
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.Eval;
+import org.apache.poi.hssf.record.formula.eval.EvaluationException;
+import org.apache.poi.hssf.record.formula.eval.NumberEval;
+import org.apache.poi.hssf.record.formula.eval.OperandResolver;
+import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
+
+/**
+ * Implementation for the ERROR.TYPE() Excel function.<p/>
+ * 
+ * <b>Syntax:</b><br/>
+ * <b>ERROR.TYPE</b>(<b>errorValue</b>)<p/>
+ * 
+ * Returns a number corresponding to the error type of the supplied argument.<p/>
+ * 
+ *    <table border="1" cellpadding="1" cellspacing="1" summary="Return values for ERROR.TYPE()">
+ *      <tr><td>errorValue</td><td>Return Value</td></tr>
+ *      <tr><td>#NULL!</td><td>1</td></tr>
+ *      <tr><td>#DIV/0!</td><td>2</td></tr>
+ *      <tr><td>#VALUE!</td><td>3</td></tr>
+ *      <tr><td>#REF!</td><td>4</td></tr>
+ *      <tr><td>#NAME?</td><td>5</td></tr>
+ *      <tr><td>#NUM!</td><td>6</td></tr>
+ *      <tr><td>#N/A!</td><td>7</td></tr>
+ *      <tr><td>everything else</td><td>#N/A!</td></tr>
+ *    </table>
+ * 
+ * Note - the results of ERROR.TYPE() are different to the constants defined in 
+ * <tt>HSSFErrorConstants</tt>.
+ * 
+ * @author Josh Micich
+ */
+public final class Errortype implements Function {
+
+       public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
+               
+               try {
+                       OperandResolver.getSingleValue(args[0], srcCellRow, srcCellCol);
+                       return ErrorEval.NA;
+               } catch (EvaluationException e) {
+                       int result = translateErrorCodeToErrorTypeValue(e.getErrorEval().getErrorCode());
+                       return new NumberEval(result);
+               }
+       }
+
+       private int translateErrorCodeToErrorTypeValue(int errorCode) {
+               switch (errorCode) {
+                       case HSSFErrorConstants.ERROR_NULL:  return 1;
+                       case HSSFErrorConstants.ERROR_DIV_0: return 2;
+                       case HSSFErrorConstants.ERROR_VALUE: return 3;
+                       case HSSFErrorConstants.ERROR_REF:   return 4;
+                       case HSSFErrorConstants.ERROR_NAME:  return 5;
+                       case HSSFErrorConstants.ERROR_NUM:   return 6;
+                       case HSSFErrorConstants.ERROR_NA :   return 7;
+               }
+               throw new IllegalArgumentException("Invalid error code (" + errorCode + ")");
+       }
 
 }
index ce94050789f600447ede6c710dd38492496b5e5e..7be92c5fa43389d199e7ad4e75b75e1c7a2043f7 100644 (file)
Binary files a/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls and b/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls differ