| 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<Expression> children, ParsingContext context) |
| { |
| if (children.Count() != 2) throw new ExcelErrorValueException(eErrorType.Value); |
| var args = new List<FunctionArgument>(); |
| 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); |
| } |
| } |
| } |