/*******************************************************************************
* 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);
}
}
}