| using OfficeOpenXml.Utils; | 
 | using System; | 
 | using System.Collections.Generic; | 
 | using System.Collections.ObjectModel; | 
 | using System.Linq; | 
 | using System.Text; | 
 | using System.Xml; | 
 |  | 
 | namespace OfficeOpenXml | 
 | { | 
 |     public class ExcelProtectedRangeCollection : XmlHelper, IEnumerable<ExcelProtectedRange> | 
 |     { | 
 |         internal ExcelProtectedRangeCollection(XmlNamespaceManager nsm, XmlNode topNode, ExcelWorksheet ws) | 
 |             : base(nsm, topNode) | 
 |         { | 
 |             foreach (XmlNode protectedRangeNode in topNode.SelectNodes("d:protectedRanges/d:protectedRange", nsm)) | 
 |             { | 
 |                 if (!(protectedRangeNode is XmlElement)) | 
 |                     continue; | 
 |                 _baseList.Add(new ExcelProtectedRange(protectedRangeNode.Attributes["name"].Value, new ExcelAddress(SqRefUtility.FromSqRefAddress(protectedRangeNode.Attributes["sqref"].Value)), nsm, topNode)); | 
 |             } | 
 |         } | 
 |  | 
 |         private List<ExcelProtectedRange> _baseList = new List<ExcelProtectedRange>(); | 
 |  | 
 |         public ExcelProtectedRange Add(string name, ExcelAddress address) | 
 |         { | 
 |             if (!ExistNode("d:protectedRanges")) | 
 |                 CreateNode("d:protectedRanges"); | 
 |              | 
 |             var newNode = CreateNode("d:protectedRanges/d:protectedRange"); | 
 |             var item = new ExcelProtectedRange(name, address, base.NameSpaceManager, newNode); | 
 |             _baseList.Add(item); | 
 |             return item; | 
 |         } | 
 |  | 
 |         public void Clear() | 
 |         { | 
 |             DeleteNode("d:protectedRanges"); | 
 |             _baseList.Clear(); | 
 |         } | 
 |  | 
 |         public bool Contains(ExcelProtectedRange item) | 
 |         { | 
 |             return _baseList.Contains(item); | 
 |         } | 
 |  | 
 |         public void CopyTo(ExcelProtectedRange[] array, int arrayIndex) | 
 |         { | 
 |             _baseList.CopyTo(array, arrayIndex); | 
 |         } | 
 |  | 
 |         public int Count | 
 |         { | 
 |             get { return _baseList.Count; } | 
 |         } | 
 |  | 
 |         public bool Remove(ExcelProtectedRange item) | 
 |         { | 
 |             DeleteAllNode("d:protectedRanges/d:protectedRange[@name='" + item.Name + "' and @sqref='" + item.Address.Address + "']"); | 
 |             if (_baseList.Count == 0) | 
 |                 DeleteNode("d:protectedRanges"); | 
 |             return _baseList.Remove(item); | 
 |         } | 
 |  | 
 |         public int IndexOf(ExcelProtectedRange item) | 
 |         { | 
 |             return _baseList.IndexOf(item); | 
 |         } | 
 |  | 
 |         public void RemoveAt(int index) | 
 |         { | 
 |             _baseList.RemoveAt(index); | 
 |         } | 
 |  | 
 |         public ExcelProtectedRange this[int index] | 
 |         { | 
 |             get | 
 |             { | 
 |                 return _baseList[index]; | 
 |             } | 
 |         } | 
 |  | 
 |         IEnumerator<ExcelProtectedRange> IEnumerable<ExcelProtectedRange>.GetEnumerator() | 
 |         { | 
 |             return _baseList.GetEnumerator(); | 
 |         } | 
 |  | 
 |         System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() | 
 |         { | 
 |             return _baseList.GetEnumerator(); | 
 |         } | 
 |     } | 
 | } |