| 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(); | 
 |         } | 
 |     } | 
 | } |