예제 #1
0
        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);
 }