|  | using System; | 
|  | using System.Collections.Generic; | 
|  | using System.Linq; | 
|  | using System.Text; | 
|  | using OfficeOpenXml.FormulaParsing.Exceptions; | 
|  | using OfficeOpenXml.FormulaParsing.ExpressionGraph; | 
|  | using OfficeOpenXml.Utils; | 
|  |  | 
|  | 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(); | 
|  | } | 
|  | } | 
|  | } |