/******************************************************************************* * 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 2009-10-01 * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ using System; using System.Collections.Generic; using System.Text; using System.Xml; using OfficeOpenXml.Table.PivotTable; namespace OfficeOpenXml.Drawing.Chart { /// /// Bar chart /// public sealed class ExcelBarChart : ExcelChart { #region "Constructors" //internal ExcelBarChart(ExcelDrawings drawings, XmlNode node) : // base(drawings, node/*, 1*/) //{ // SetChartNodeText(""); //} //internal ExcelBarChart(ExcelDrawings drawings, XmlNode node, eChartType type) : // base(drawings, node, type) //{ // SetChartNodeText(""); // SetTypeProperties(drawings, type); //} internal ExcelBarChart(ExcelDrawings drawings, XmlNode node, eChartType type, ExcelChart topChart, ExcelPivotTable PivotTableSource) : base(drawings, node, type, topChart, PivotTableSource) { SetChartNodeText(""); SetTypeProperties(drawings, type); } internal ExcelBarChart(ExcelDrawings drawings, XmlNode node, Uri uriChart, Packaging.ZipPackagePart part, XmlDocument chartXml, XmlNode chartNode) : base(drawings, node, uriChart, part, chartXml, chartNode) { SetChartNodeText(chartNode.Name); } internal ExcelBarChart(ExcelChart topChart, XmlNode chartNode) : base(topChart, chartNode) { SetChartNodeText(chartNode.Name); } #endregion #region "Private functions" //string _chartTopPath="c:chartSpace/c:chart/c:plotArea/{0}"; private void SetChartNodeText(string chartNodeText) { if(string.IsNullOrEmpty(chartNodeText)) { chartNodeText = GetChartNodeText(); } //_chartTopPath = string.Format(_chartTopPath, chartNodeText); //_directionPath = string.Format(_directionPath, _chartTopPath); //_shapePath = string.Format(_shapePath, _chartTopPath); } private void SetTypeProperties(ExcelDrawings drawings, eChartType type) { /******* Bar direction *******/ if (type == eChartType.BarClustered || type == eChartType.BarStacked || type == eChartType.BarStacked100 || type == eChartType.BarClustered3D || type == eChartType.BarStacked3D || type == eChartType.BarStacked1003D || type == eChartType.ConeBarClustered || type == eChartType.ConeBarStacked || type == eChartType.ConeBarStacked100 || type == eChartType.CylinderBarClustered || type == eChartType.CylinderBarStacked || type == eChartType.CylinderBarStacked100 || type == eChartType.PyramidBarClustered || type == eChartType.PyramidBarStacked || type == eChartType.PyramidBarStacked100) { Direction = eDirection.Bar; } else if ( type == eChartType.ColumnClustered || type == eChartType.ColumnStacked || type == eChartType.ColumnStacked100 || type == eChartType.Column3D || type == eChartType.ColumnClustered3D || type == eChartType.ColumnStacked3D || type == eChartType.ColumnStacked1003D || type == eChartType.ConeCol || type == eChartType.ConeColClustered || type == eChartType.ConeColStacked || type == eChartType.ConeColStacked100 || type == eChartType.CylinderCol || type == eChartType.CylinderColClustered || type == eChartType.CylinderColStacked || type == eChartType.CylinderColStacked100 || type == eChartType.PyramidCol || type == eChartType.PyramidColClustered || type == eChartType.PyramidColStacked || type == eChartType.PyramidColStacked100) { Direction = eDirection.Column; } /****** Shape ******/ if (/*type == eChartType.ColumnClustered || type == eChartType.ColumnStacked || type == eChartType.ColumnStacked100 ||*/ type == eChartType.Column3D || type == eChartType.ColumnClustered3D || type == eChartType.ColumnStacked3D || type == eChartType.ColumnStacked1003D || /*type == eChartType.BarClustered || type == eChartType.BarStacked || type == eChartType.BarStacked100 ||*/ type == eChartType.BarClustered3D || type == eChartType.BarStacked3D || type == eChartType.BarStacked1003D) { Shape = eShape.Box; } else if ( type == eChartType.CylinderBarClustered || type == eChartType.CylinderBarStacked || type == eChartType.CylinderBarStacked100 || type == eChartType.CylinderCol || type == eChartType.CylinderColClustered || type == eChartType.CylinderColStacked || type == eChartType.CylinderColStacked100) { Shape = eShape.Cylinder; } else if ( type == eChartType.ConeBarClustered || type == eChartType.ConeBarStacked || type == eChartType.ConeBarStacked100 || type == eChartType.ConeCol || type == eChartType.ConeColClustered || type == eChartType.ConeColStacked || type == eChartType.ConeColStacked100) { Shape = eShape.Cone; } else if ( type == eChartType.PyramidBarClustered || type == eChartType.PyramidBarStacked || type == eChartType.PyramidBarStacked100 || type == eChartType.PyramidCol || type == eChartType.PyramidColClustered || type == eChartType.PyramidColStacked || type == eChartType.PyramidColStacked100) { Shape = eShape.Pyramid; } } #endregion #region "Properties" string _directionPath = "c:barDir/@val"; /// /// Direction, Bar or columns /// public eDirection Direction { get { return GetDirectionEnum(_chartXmlHelper.GetXmlNodeString(_directionPath)); } internal set { _chartXmlHelper.SetXmlNodeString(_directionPath, GetDirectionText(value)); } } string _shapePath = "c:shape/@val"; /// /// The shape of the bar/columns /// public eShape Shape { get { return GetShapeEnum(_chartXmlHelper.GetXmlNodeString(_shapePath)); } internal set { _chartXmlHelper.SetXmlNodeString(_shapePath, GetShapeText(value)); } } ExcelChartDataLabel _DataLabel = null; /// /// Access to datalabel properties /// public ExcelChartDataLabel DataLabel { get { if (_DataLabel == null) { _DataLabel = new ExcelChartDataLabel(NameSpaceManager, ChartNode); } return _DataLabel; } } #endregion #region "Direction Enum Traslation" private string GetDirectionText(eDirection direction) { switch (direction) { case eDirection.Bar: return "bar"; default: return "col"; } } private eDirection GetDirectionEnum(string direction) { switch (direction) { case "bar": return eDirection.Bar; default: return eDirection.Column; } } #endregion #region "Shape Enum Translation" private string GetShapeText(eShape Shape) { switch (Shape) { case eShape.Box: return "box"; case eShape.Cone: return "cone"; case eShape.ConeToMax: return "coneToMax"; case eShape.Cylinder: return "cylinder"; case eShape.Pyramid: return "pyramid"; case eShape.PyramidToMax: return "pyramidToMax"; default: return "box"; } } private eShape GetShapeEnum(string text) { switch (text) { case "box": return eShape.Box; case "cone": return eShape.Cone; case "coneToMax": return eShape.ConeToMax; case "cylinder": return eShape.Cylinder; case "pyramid": return eShape.Pyramid; case "pyramidToMax": return eShape.PyramidToMax; default: return eShape.Box; } } #endregion internal override eChartType GetChartType(string name) { if (name == "barChart") { if (this.Direction == eDirection.Bar) { if (Grouping == eGrouping.Stacked) { return eChartType.BarStacked; } else if (Grouping == eGrouping.PercentStacked) { return eChartType.BarStacked100; } else { return eChartType.BarClustered; } } else { if (Grouping == eGrouping.Stacked) { return eChartType.ColumnStacked; } else if (Grouping == eGrouping.PercentStacked) { return eChartType.ColumnStacked100; } else { return eChartType.ColumnClustered; } } } if (name == "bar3DChart") { #region "Bar Shape" if (this.Shape==eShape.Box) { if (this.Direction == eDirection.Bar) { if (Grouping == eGrouping.Stacked) { return eChartType.BarStacked3D; } else if (Grouping == eGrouping.PercentStacked) { return eChartType.BarStacked1003D; } else { return eChartType.BarClustered3D; } } else { if (Grouping == eGrouping.Stacked) { return eChartType.ColumnStacked3D; } else if (Grouping == eGrouping.PercentStacked) { return eChartType.ColumnStacked1003D; } else { return eChartType.ColumnClustered3D; } } } #endregion #region "Cone Shape" if (this.Shape == eShape.Cone || this.Shape == eShape.ConeToMax) { if (this.Direction == eDirection.Bar) { if (Grouping == eGrouping.Stacked) { return eChartType.ConeBarStacked; } else if (Grouping == eGrouping.PercentStacked) { return eChartType.ConeBarStacked100; } else if (Grouping == eGrouping.Clustered) { return eChartType.ConeBarClustered; } } else { if (Grouping == eGrouping.Stacked) { return eChartType.ConeColStacked; } else if (Grouping == eGrouping.PercentStacked) { return eChartType.ConeColStacked100; } else if (Grouping == eGrouping.Clustered) { return eChartType.ConeColClustered; } else { return eChartType.ConeCol; } } } #endregion #region "Cylinder Shape" if (this.Shape == eShape.Cylinder) { if (this.Direction == eDirection.Bar) { if (Grouping == eGrouping.Stacked) { return eChartType.CylinderBarStacked; } else if (Grouping == eGrouping.PercentStacked) { return eChartType.CylinderBarStacked100; } else if (Grouping == eGrouping.Clustered) { return eChartType.CylinderBarClustered; } } else { if (Grouping == eGrouping.Stacked) { return eChartType.CylinderColStacked; } else if (Grouping == eGrouping.PercentStacked) { return eChartType.CylinderColStacked100; } else if (Grouping == eGrouping.Clustered) { return eChartType.CylinderColClustered; } else { return eChartType.CylinderCol; } } } #endregion #region "Pyramide Shape" if (this.Shape == eShape.Pyramid || this.Shape == eShape.PyramidToMax) { if (this.Direction == eDirection.Bar) { if (Grouping == eGrouping.Stacked) { return eChartType.PyramidBarStacked; } else if (Grouping == eGrouping.PercentStacked) { return eChartType.PyramidBarStacked100; } else if (Grouping == eGrouping.Clustered) { return eChartType.PyramidBarClustered; } } else { if (Grouping == eGrouping.Stacked) { return eChartType.PyramidColStacked; } else if (Grouping == eGrouping.PercentStacked) { return eChartType.PyramidColStacked100; } else if (Grouping == eGrouping.Clustered) { return eChartType.PyramidColClustered; } else { return eChartType.PyramidCol; } } } #endregion } return base.GetChartType(name); } } }