public override CompileResult Compile() { var offsetRange1 = OffsetExpression1.Compile().Result as ExcelDataProvider.IRangeInfo; var rangeOffset = new RangeOffset { StartRange = offsetRange1 }; if (AddressExpression2 != null) { var c = _parsingContext.Scopes.Current; var resultRange = _parsingContext.ExcelDataProvider.GetRange(c.Address.Worksheet, c.Address.FromRow, c.Address.FromCol, AddressExpression2.ExpressionString); rangeOffset.EndRange = resultRange; } else { var offsetRange2 = OffsetExpression2.Compile().Result; rangeOffset.EndRange = offsetRange2 as ExcelDataProvider.IRangeInfo; } return(new CompileResult(rangeOffset.Execute(new FunctionArgument[] { }, _parsingContext).Result, DataType.Enumerable)); }
public override bool Handle(string funcName, IEnumerable <Expression> children, ParsingContext context, out ExcelFunction function) { function = null; if (funcName.Contains(":OFFSET")) { var functionCompilerFactory = new FunctionCompilerFactory(context.Configuration.FunctionRepository, context); var startRange = funcName.Split(':')[0]; var c = context.Scopes.Current; var resultRange = context.ExcelDataProvider.GetRange(c.Address.Worksheet, c.Address.FromRow, c.Address.FromCol, startRange); var rangeOffset = new RangeOffset { StartRange = resultRange }; var compiler = functionCompilerFactory.Create(new Offset()); children.First().Children.First().IgnoreCircularReference = true; var compileResult = compiler.Compile(children); rangeOffset.EndRange = compileResult.Result as ExcelDataProvider.IRangeInfo; function = rangeOffset; return(true); } return(false); }