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