|  | using System; | 
|  | using System.Collections.Generic; | 
|  | using System.Linq; | 
|  | using OfficeOpenXml.FormulaParsing.Exceptions; | 
|  | using OfficeOpenXml.FormulaParsing.ExpressionGraph; | 
|  |  | 
|  | namespace OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; | 
|  |  | 
|  | public class Index : ExcelFunction { | 
|  | public override CompileResult Execute( | 
|  | IEnumerable<FunctionArgument> arguments, | 
|  | ParsingContext context) { | 
|  | ValidateArguments(arguments, 2); | 
|  | var arg1 = arguments.ElementAt(0); | 
|  | var args = arg1.Value as IEnumerable<FunctionArgument>; | 
|  | var crf = new CompileResultFactory(); | 
|  | if (args != null) { | 
|  | var index = ArgToInt(arguments, 1); | 
|  | if (index > args.Count()) { | 
|  | throw new ExcelErrorValueException(eErrorType.Ref); | 
|  | } | 
|  | var candidate = args.ElementAt(index - 1); | 
|  | //Commented JK-Can be any data type | 
|  | //if (!IsNumber(candidate.Value)) | 
|  | //{ | 
|  | //    throw new ExcelErrorValueException(eErrorType.Value); | 
|  | //} | 
|  | //return CreateResult(ConvertUtil.GetValueDouble(candidate.Value), DataType.Decimal); | 
|  | return crf.Create(candidate.Value); | 
|  | } | 
|  | if (arg1.IsExcelRange) { | 
|  | var row = ArgToInt(arguments, 1); | 
|  | var col = arguments.Count() > 2 ? ArgToInt(arguments, 2) : 1; | 
|  | var ri = arg1.ValueAsRangeInfo; | 
|  | if (row > ri.Address._toRow - ri.Address._fromRow + 1 | 
|  | || col > ri.Address._toCol - ri.Address._fromCol + 1) { | 
|  | ThrowExcelErrorValueException(eErrorType.Ref); | 
|  | } | 
|  | var candidate = ri.GetOffset(row - 1, col - 1); | 
|  | //Commented JK-Can be any data type | 
|  | //if (!IsNumber(candidate.Value)) | 
|  | //{ | 
|  | //    throw new ExcelErrorValueException(eErrorType.Value); | 
|  | //} | 
|  | return crf.Create(candidate); | 
|  | } | 
|  | throw new NotImplementedException(); | 
|  | } | 
|  | } |