コード例 #1
0
 public ParsingScope(ParsingScopes parsingScopes, ParsingScope parent, RangeAddress address)
 {
     _parsingScopes = parsingScopes;
     Parent = parent;
     Address = address;
     ScopeId = Guid.NewGuid();
 }
コード例 #2
0
ファイル: Ranges.cs プロジェクト: swmal/ExcelFormulaParser
 public virtual void Add(ParsingScope parsingScope, RangeAddress rangeAddress)
 {
     if (!_rangeAddresses.ContainsKey(parsingScope.ScopeId))
     {
         _rangeAddresses.Add(parsingScope.ScopeId, new List<RangeAddress>());
     }
     _rangeAddresses[parsingScope.ScopeId].Add(rangeAddress);
 }
コード例 #3
0
 public virtual void AddReferenceTo(RangeAddress rangeAddress)
 {
     if (Address.CollidesWith(rangeAddress) || _referencedBy.Exists(x => x.CollidesWith(rangeAddress)))
     {
         throw new CircularReferenceException("Circular reference detected at " + rangeAddress.ToString());
     }
     _references.Add(rangeAddress);
 }
コード例 #4
0
 private void HandleMultipleCellAddress(RangeAddress rangeAddress, ExcelAddressInfo addressInfo)
 {
     int fromCol, fromRow;
     _addressTranslator.ToColAndRow(addressInfo.StartCell, out fromCol, out fromRow);
     int toCol, toRow;
     _addressTranslator.ToColAndRow(addressInfo.EndCell, out toCol, out toRow, AddressTranslator.RangeCalculationBehaviour.LastPart);
     rangeAddress.FromCol = fromCol;
     rangeAddress.ToCol = toCol;
     rangeAddress.FromRow = fromRow;
     rangeAddress.ToRow = toRow;
 }
コード例 #5
0
ファイル: Ranges.cs プロジェクト: swmal/ExcelFormulaParser
 public virtual void CheckCircularReference(ParsingScope scope, RangeAddress rangeAddress)
 {
     var conflictingScope = (from r in _rangeAddresses
                          where r.Key != scope.ScopeId
                          && r.Value.Exists(x => x.CollidesWith(rangeAddress))
                          select r).FirstOrDefault();
     if(conflictingScope.Value != null)
     {
         var conflictingRange = conflictingScope.Value.Find(x => x.CollidesWith(rangeAddress));
         var errMsg = string.Format("Circular reference detected between {0} and {1}", conflictingRange, rangeAddress);
         throw new CircularReferenceException(errMsg);
     }
 }
コード例 #6
0
 public virtual ParsingScope NewScope(RangeAddress address)
 {
     ParsingScope scope;
     if (_scopes.Count() > 0)
     {
         scope = new ParsingScope(this, _scopes.Peek(), address);
     }
     else
     {
         scope = new ParsingScope(this, address);
     }
     _scopes.Push(scope);
     return scope;
 }
コード例 #7
0
 /// <summary>
 /// Returns true if this range collides (full or partly) with the supplied range
 /// </summary>
 /// <param name="other">The range to check</param>
 /// <returns></returns>
 public bool CollidesWith(RangeAddress other)
 {
     if (other.Worksheet != Worksheet)
     {
         return false;
     }
     if (other.FromRow > ToRow || other.FromCol > ToCol
         ||
         FromRow > other.ToRow || FromCol > other.ToCol)
     {
         return false;
     }
     return true;
 }
コード例 #8
0
        public RangeAddress Create(string range)
        {
            Require.That(range).Named("range").IsNotNullOrEmpty();
            var addressInfo  = ExcelAddressInfo.Parse(range);
            var rangeAddress = new RangeAddress()
            {
                Address   = range,
                Worksheet = addressInfo.Worksheet
            };

            if (addressInfo.IsMultipleCells)
            {
                HandleMultipleCellAddress(rangeAddress, addressInfo);
            }
            else
            {
                HandleSingleCellAddress(rangeAddress, addressInfo);
            }
            return(rangeAddress);
        }
コード例 #9
0
        public RangeAddress Create(string range)
        {
            Require.That(range).Named("range").IsNotNullOrEmpty();
            var addressInfo = ExcelAddressInfo.Parse(range);
            var rangeAddress = new RangeAddress()
            {
                Address = range,
                Worksheet = addressInfo.Worksheet
            };

            if (addressInfo.IsMultipleCells)
            {
                HandleMultipleCellAddress(rangeAddress, addressInfo);
            }
            else
            {
                HandleSingleCellAddress(rangeAddress, addressInfo);
            }
            return rangeAddress;
        }
コード例 #10
0
 public virtual void Add(ParsingScope parsingScope, string rangeAddress)
 {
     Add(parsingScope, RangeAddress.Parse(rangeAddress));
 }
コード例 #11
0
 private void Initialize()
 {
     var factory = new RangeAddressFactory(_parsingContext.ExcelDataProvider);
     _rangeAddress = factory.Create(_arguments.RangeAddress);
     _currentCol = _rangeAddress.FromCol;
     _currentRow = _rangeAddress.FromRow;
     SetCurrentValue();
 }
コード例 #12
0
 protected LookupDirection GetLookupDirection(RangeAddress rangeAddress)
 {
     var nRows = rangeAddress.ToRow - rangeAddress.FromRow;
     var nCols = rangeAddress.ToCol - rangeAddress.FromCol;
     return nCols > nRows ? LookupDirection.Horizontal : LookupDirection.Vertical;
 }
コード例 #13
0
 internal virtual object Parse(string formula, RangeAddress rangeAddress)
 {
     using (var scope = _parsingContext.Scopes.NewScope(rangeAddress))
     {
         _parsingContext.Dependencies.AddFormulaScope(scope);
         var tokens = _lexer.Tokenize(formula);
         var graph = _graphBuilder.Build(tokens);
         if (graph.Expressions.Count() == 0)
         {
             return null;
         }
         return _compiler.Compile(graph.Expressions).Result;
     }
 }
コード例 #14
0
 public ParsingScope(ParsingScopes parsingScopes, RangeAddress address)
     : this(parsingScopes, null, address)
 {
 }
コード例 #15
0
 private void HandleSingleCellAddress(RangeAddress rangeAddress, ExcelAddressInfo addressInfo)
 {
     int col, row;
     _addressTranslator.ToColAndRow(addressInfo.StartCell, out col, out row);
     rangeAddress.FromCol = col;
     rangeAddress.ToCol = col;
     rangeAddress.FromRow = row;
     rangeAddress.ToRow = row;
 }