/* * 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. */ namespace HH.WMS.Utils.NPOI.SS.Formula.Eval { using System; using System.Text; using HH.WMS.Utils.NPOI.HSSF.UserModel; /** * @author Amol S. Deshmukh < amolweb at ya hoo dot com > * */ public class ErrorEval : ValueEval { // convenient access to namespace private const HSSFErrorConstants EC = null; /** #NULL! - Intersection of two cell ranges is empty */ public static ErrorEval NULL_INTERSECTION = new ErrorEval(HSSFErrorConstants.ERROR_NULL); /** #DIV/0! - Division by zero */ public static ErrorEval DIV_ZERO = new ErrorEval(HSSFErrorConstants.ERROR_DIV_0); /** #VALUE! - Wrong type of operand */ public static ErrorEval VALUE_INVALID = new ErrorEval(HSSFErrorConstants.ERROR_VALUE); /** #REF! - Illegal or deleted cell reference */ public static ErrorEval REF_INVALID = new ErrorEval(HSSFErrorConstants.ERROR_REF); /** #NAME? - Wrong function or range name */ public static ErrorEval NAME_INVALID = new ErrorEval(HSSFErrorConstants.ERROR_NAME); /** #NUM! - Value range overflow */ public static ErrorEval NUM_ERROR = new ErrorEval(HSSFErrorConstants.ERROR_NUM); /** #N/A - Argument or function not available */ public static ErrorEval NA = new ErrorEval(HSSFErrorConstants.ERROR_NA); // POI internal error codes private const int CIRCULAR_REF_ERROR_CODE = unchecked((int)0xFFFFFFC4); private const int FUNCTION_NOT_IMPLEMENTED_CODE = unchecked((int)0xFFFFFFE2); public static ErrorEval FUNCTION_NOT_IMPLEMENTED = new ErrorEval(FUNCTION_NOT_IMPLEMENTED_CODE); // Note - Excel does not seem to represent this condition with an error code public static ErrorEval CIRCULAR_REF_ERROR = new ErrorEval(CIRCULAR_REF_ERROR_CODE); /** * Translates an Excel internal error code into the corresponding POI ErrorEval instance * @param errorCode */ public static ErrorEval ValueOf(int errorCode) { switch (errorCode) { case HSSFErrorConstants.ERROR_NULL: return NULL_INTERSECTION; case HSSFErrorConstants.ERROR_DIV_0: return DIV_ZERO; case HSSFErrorConstants.ERROR_VALUE: return VALUE_INVALID; case HSSFErrorConstants.ERROR_REF: return REF_INVALID; case HSSFErrorConstants.ERROR_NAME: return NAME_INVALID; case HSSFErrorConstants.ERROR_NUM: return NUM_ERROR; case HSSFErrorConstants.ERROR_NA: return NA; // non-std errors (conditions modeled as errors by POI) case CIRCULAR_REF_ERROR_CODE: return CIRCULAR_REF_ERROR; case FUNCTION_NOT_IMPLEMENTED_CODE: return FUNCTION_NOT_IMPLEMENTED; } throw new Exception("Unexpected error code (" + errorCode + ")"); } /** * Converts error codes to text. Handles non-standard error codes OK. * For debug/test purposes (and for formatting error messages). * @return the String representation of the specified Excel error code. */ public static String GetText(int errorCode) { if (HSSFErrorConstants.IsValidCode(errorCode)) { return HSSFErrorConstants.GetText(errorCode); } // It is desirable to make these (arbitrary) strings look clearly different from any other // value expression that might appear in a formula. In Addition these error strings should // look Unlike the standard Excel errors. Hence tilde ('~') was used. switch (errorCode) { case CIRCULAR_REF_ERROR_CODE: return "~CIRCULAR~REF~"; case FUNCTION_NOT_IMPLEMENTED_CODE: return "~FUNCTION~NOT~IMPLEMENTED~"; } return "~non~std~err(" + errorCode + ")~"; } private int _errorCode; /** * @param errorCode an 8-bit value */ private ErrorEval(int errorCode) { _errorCode = errorCode; } public int ErrorCode { get{return _errorCode;} } public override String ToString() { StringBuilder sb = new StringBuilder(64); sb.Append(GetType().Name).Append(" ["); sb.Append(GetText(_errorCode)); sb.Append("]"); return sb.ToString(); } } }