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