/******************************************************************************* * You may amend and distribute as you like, but don't remove this header! * * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets. * See http://www.codeplex.com/EPPlus for details. * * Copyright (C) 2011 Jan Källman * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html * * All code and executables are provided "as is" with no warranty either express or implied. * The author accepts no liability for any damage or loss of business that this product may cause. * * Code change notes: * * Author Change Date * ****************************************************************************** * Jan Källman Added 21-MAR-2011 * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ using System; using System.Collections.Generic; using System.Text; using System.Xml; namespace OfficeOpenXml.Table.PivotTable { /// /// A collection of pivottable objects /// public class ExcelPivotTableCollection : IEnumerable { List _pivotTables = new List(); internal Dictionary _pivotTableNames = new Dictionary(); ExcelWorksheet _ws; internal ExcelPivotTableCollection(ExcelWorksheet ws) { var pck = ws._package.Package; _ws = ws; foreach(var rel in ws.Part.GetRelationships()) { if (rel.RelationshipType == ExcelPackage.schemaRelationships + "/pivotTable") { var tbl = new ExcelPivotTable(rel, ws); _pivotTableNames.Add(tbl.Name, _pivotTables.Count); if (tbl.Id + 1 > _ws.Workbook._nextPivotTableID) _ws.Workbook._nextPivotTableID = tbl.Id + 1; _pivotTables.Add(tbl); } } } private ExcelPivotTable Add(ExcelPivotTable tbl) { _pivotTables.Add(tbl); _pivotTableNames.Add(tbl.Name, _pivotTables.Count - 1); if (tbl.Id >= _ws.Workbook._nextPivotTableID) { _ws.Workbook._nextPivotTableID = tbl.Id + 1; } return tbl; } /// /// Create a pivottable on the supplied range /// /// The range address including header and total row /// The Source data range address /// The name of the table. Must be unique /// The pivottable object public ExcelPivotTable Add(ExcelAddressBase Range, ExcelRangeBase Source, string Name) { if (string.IsNullOrEmpty(Name)) { Name = GetNewTableName(); } if (Range.WorkSheet != _ws.Name) { throw(new Exception("The Range must be in the current worksheet")); } else if (_ws.Workbook.ExistsTableName(Name)) { throw (new ArgumentException("Tablename is not unique")); } foreach (var t in _pivotTables) { if (t.Address.Collide(Range) != ExcelAddressBase.eAddressCollition.No) { throw (new ArgumentException(string.Format("Table range collides with table {0}", t.Name))); } } return Add(new ExcelPivotTable(_ws, Range, Source, Name, _ws.Workbook._nextPivotTableID++)); } internal string GetNewTableName() { string name = "Pivottable1"; int i = 2; while (_ws.Workbook.ExistsPivotTableName(name)) { name = string.Format("Pivottable{0}", i++); } return name; } public int Count { get { return _pivotTables.Count; } } /// /// The pivottable Index. Base 0. /// /// /// public ExcelPivotTable this[int Index] { get { if (Index < 0 || Index >= _pivotTables.Count) { throw (new ArgumentOutOfRangeException("PivotTable index out of range")); } return _pivotTables[Index]; } } /// /// Pivottabes accesed by name /// /// The name of the pivottable /// The Pivotable. Null if the no match is found public ExcelPivotTable this[string Name] { get { if (_pivotTableNames.ContainsKey(Name)) { return _pivotTables[_pivotTableNames[Name]]; } else { return null; } } } public IEnumerator GetEnumerator() { return _pivotTables.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return _pivotTables.GetEnumerator(); } } }