using System; using System.Collections.Generic; using System.Linq; using System.Text; using OfficeOpenXml.FormulaParsing.Excel.Functions; using OfficeOpenXml.FormulaParsing.Exceptions; namespace OfficeOpenXml.FormulaParsing.ExpressionGraph.FunctionCompilers { public class IfNaFunctionCompiler : FunctionCompiler { public IfNaFunctionCompiler(ExcelFunction function) :base(function) { } public override CompileResult Compile(IEnumerable children, ParsingContext context) { if (children.Count() != 2) throw new ExcelErrorValueException(eErrorType.Value); var args = new List(); Function.BeforeInvoke(context); var firstChild = children.First(); var lastChild = children.ElementAt(1); try { var result = firstChild.Compile(); if (result.DataType == DataType.ExcelError && (Equals(result.Result, ExcelErrorValue.Create(eErrorType.NA)))) { args.Add(new FunctionArgument(lastChild.Compile().Result)); } else { args.Add(new FunctionArgument(result.Result)); } } catch (ExcelErrorValueException ex) { args.Add(new FunctionArgument(lastChild.Compile().Result)); } return Function.Execute(args, context); } } }