/// <summary> /// Initializes a new instance of the <see cref="CompositeRangeReference" /> class.<br/> /// </summary> /// <param name="rangeReference">The range reference used to initialise this composite.</param> public CompositeRangeReference(RangeReference rangeReference) : this() { this.Update(rangeReference); }
/// <summary> /// Updates this <see cref="CompositeRangeReference"/> with a new range reference. /// </summary> /// <param name="rangeReference">The <see cref="RangeReference"/> to be added</param> public void Update(RangeReference rangeReference) { if (this.rangeReferences.Count == 0) { this.rangeReferences.Add(rangeReference); this.sheetName = rangeReference.SheetName; this.minRowIndex = rangeReference.StartRowIndex; this.maxRowIndex = rangeReference.EndRowIndex; this.minColumnIndex = rangeReference.StartColumnIndex; this.maxColumnIndex = rangeReference.EndColumnIndex; } else { if (this.sheetName != rangeReference.SheetName) { var sb = new StringBuilder(); sb.AppendLine("Cannot create a composite range reference using 2 different worksheets."); sb.AppendFormat("Last added worksheet was '{0}', trying to add '{1}'", this.sheetName, rangeReference.SheetName); throw new InvalidOperationException(sb.ToString()); } RangeReference lrr = this.rangeReferences[this.rangeReferences.Count - 1]; bool sameColumns = lrr.StartColumnIndex == rangeReference.StartColumnIndex && lrr.EndColumnIndex == rangeReference.EndColumnIndex; bool sameRows = lrr.StartRowIndex == rangeReference.StartRowIndex && lrr.EndRowIndex == rangeReference.EndRowIndex; if (sameColumns && lrr.EndRowIndex > 0 && lrr.EndRowIndex == (rangeReference.StartRowIndex - 1)) { // Update last to append after rows lrr.EndRowIndex = rangeReference.EndRowIndex; } else if (sameColumns && rangeReference.EndRowIndex > 0 && lrr.StartRowIndex == (rangeReference.EndRowIndex + 1)) { // Update last to append before rows lrr.StartRowIndex = rangeReference.StartRowIndex; } else if (sameRows && lrr.EndColumnIndex > 0 && lrr.EndColumnIndex == (rangeReference.StartColumnIndex - 1)) { // Update last to append after columns lrr.EndColumnIndex = rangeReference.EndColumnIndex; } else if (sameColumns && rangeReference.EndRowIndex > 0 && lrr.StartRowIndex == (rangeReference.EndRowIndex + 1)) { // Update last to append before columns lrr.StartColumnIndex = rangeReference.StartColumnIndex; } else if (!sameColumns || !sameRows) { // Finally, unless we actually have the same range, can't append, so add to list... this.rangeReferences.Add(rangeReference); } // Update min/max row and column indexes if (rangeReference.StartRowIndex < this.minRowIndex) { this.minRowIndex = rangeReference.StartRowIndex; } if (rangeReference.EndRowIndex > this.maxRowIndex) { this.maxRowIndex = rangeReference.EndRowIndex; } if (rangeReference.StartColumnIndex < this.minColumnIndex) { this.minColumnIndex = rangeReference.StartColumnIndex; } if (rangeReference.EndColumnIndex > this.maxColumnIndex) { this.maxColumnIndex = rangeReference.EndRowIndex; } } this.reference = this.GetExcelAbsoluteRef(); }