diff --git a/OpenXmlFormats/Drawing/BaseTypes.cs b/OpenXmlFormats/Drawing/BaseTypes.cs index 3f7d5d9f9..e3ba3d8cc 100644 --- a/OpenXmlFormats/Drawing/BaseTypes.cs +++ b/OpenXmlFormats/Drawing/BaseTypes.cs @@ -1274,6 +1274,23 @@ public CT_PositiveFixedPercentage AddNewShade() this.itemsValueField.Add(null); return obj; } + + public void AddNewLum(int dpIndex) + { + var accentsLoopIndex = dpIndex / 6; + //modValue and offValue allows to set custom tint on accent color + //in such a way we can get unique colors for each pie sector. + if (accentsLoopIndex != 0) + { + var modValue = 10000 * new Random().Next(2, 9); + var offValue = 10000 * new Random().Next(1, 5); + itemsElementNameField.Add(EG_ColorTransform.lumMod); + itemsValueField.Add(modValue.ToString()); + itemsElementNameField.Add(EG_ColorTransform.lumOff); + itemsValueField.Add(offValue.ToString()); + } + } + public static CT_SchemeColor Parse(XmlNode node, XmlNamespaceManager namespaceManager) { if (node == null) diff --git a/OpenXmlFormats/Drawing/Chart/AreaChart.cs b/OpenXmlFormats/Drawing/Chart/AreaChart.cs index 198bc6517..b40d470ca 100644 --- a/OpenXmlFormats/Drawing/Chart/AreaChart.cs +++ b/OpenXmlFormats/Drawing/Chart/AreaChart.cs @@ -510,8 +510,31 @@ public List extLst this.extLstField = value; } } - } + public CT_UnsignedInt AddNewIdx() + { + this.idxField = new CT_UnsignedInt(); + return this.idxField; + } + + public CT_UnsignedInt AddNewOrder() + { + this.orderField = new CT_UnsignedInt(); + return this.orderField; + } + + public CT_AxDataSource AddNewCat() + { + this.catField = new CT_AxDataSource(); + return this.catField; + } + + public CT_NumDataSource AddNewVal() + { + this.valField = new CT_NumDataSource(); + return this.valField; + } + } [Serializable] @@ -700,5 +723,31 @@ public List extLst this.extLstField = value; } } + + public CT_Boolean AddNewVaryColors() + { + this.varyColorsField = new CT_Boolean(); + return this.varyColorsField; + } + + public CT_UnsignedInt AddNewAxId() + { + CT_UnsignedInt si = new CT_UnsignedInt(); + if (this.axIdField == null) + this.axIdField = new List(); + axIdField.Add(si); + return si; + } + + public CT_AreaSer AddNewSer() + { + CT_AreaSer newSer = new CT_AreaSer(); + if (this.serField == null) + { + this.serField = new List(); + } + this.serField.Add(newSer); + return newSer; + } } } diff --git a/OpenXmlFormats/Drawing/Chart/Chart.cs b/OpenXmlFormats/Drawing/Chart/Chart.cs index d25909499..d6459d23d 100644 --- a/OpenXmlFormats/Drawing/Chart/Chart.cs +++ b/OpenXmlFormats/Drawing/Chart/Chart.cs @@ -10371,6 +10371,15 @@ public CT_Pie3DChart AddNewPie3DChart() return newobj; } + public CT_PieChart AddNewPieChart() + { + if (this.pieChartField == null) + this.pieChartField = new List(); + CT_PieChart newobj = new CT_PieChart(); + this.pieChartField.Add(newobj); + return newobj; + } + public CT_ScatterChart AddNewScatterChart() { if (this.scatterChartField == null) @@ -10612,6 +10621,17 @@ public CT_BarChart AddNewBarChart() return ctchart; } + public CT_AreaChart AddNewAreaChart() + { + CT_AreaChart ctchart = new CT_AreaChart(); + if (this.areaChartField == null) + { + this.areaChartField = new List(); + } + this.areaChartField.Add(ctchart); + return ctchart; + } + public CT_LineChart AddNewLineChart() { CT_LineChart ctchart = new CT_LineChart(); diff --git a/OpenXmlFormats/Drawing/Chart/PieChart.cs b/OpenXmlFormats/Drawing/Chart/PieChart.cs index 8704a2f35..310008400 100644 --- a/OpenXmlFormats/Drawing/Chart/PieChart.cs +++ b/OpenXmlFormats/Drawing/Chart/PieChart.cs @@ -279,6 +279,23 @@ public List extLst this.extLstField = value; } } + + public CT_PieSer AddNewSer() + { + CT_PieSer newSer = new CT_PieSer(); + if (this.serField == null) + { + this.serField = new List(); + } + this.serField.Add(newSer); + return newSer; + } + + public CT_Boolean AddNewVaryColors() + { + this.varyColorsField = new CT_Boolean(); + return this.varyColorsField; + } } [Serializable] @@ -311,7 +328,7 @@ public class CT_PieSer public CT_PieSer() { - + dPt = new List(); } public static CT_PieSer Parse(XmlNode node, XmlNamespaceManager namespaceManager) { @@ -515,6 +532,30 @@ public List extLst this.extLstField = value; } } + + public CT_UnsignedInt AddNewIdx() + { + this.idxField = new CT_UnsignedInt(); + return this.idxField; + } + + public CT_UnsignedInt AddNewOrder() + { + this.orderField = new CT_UnsignedInt(); + return this.orderField; + } + + public CT_AxDataSource AddNewCat() + { + this.catField = new CT_AxDataSource(); + return this.catField; + } + + public CT_NumDataSource AddNewVal() + { + this.valField = new CT_NumDataSource(); + return this.valField; + } } diff --git a/main/NPOI.csproj b/main/NPOI.csproj index 96fbe4569..1b0e4a795 100644 --- a/main/NPOI.csproj +++ b/main/NPOI.csproj @@ -777,11 +777,15 @@ + + + + @@ -789,6 +793,8 @@ + + diff --git a/main/SS/UserModel/Charts/AreaChartData.cs b/main/SS/UserModel/Charts/AreaChartData.cs new file mode 100644 index 000000000..5bc9ca343 --- /dev/null +++ b/main/SS/UserModel/Charts/AreaChartData.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NPOI.SS.UserModel.Charts +{ + /// + /// Data for an Area Chart + /// + public interface IAreaChartData : IChartData + { + + /// + /// Adds the series. + /// + /// The categories data source. + /// The values data source. + /// Created series. + IAreaChartSeries AddSeries(IChartDataSource categories, IChartDataSource values); + + /// + /// Return list of all series. + /// + List> GetSeries(); + } +} diff --git a/main/SS/UserModel/Charts/AreaChartSeries.cs b/main/SS/UserModel/Charts/AreaChartSeries.cs new file mode 100644 index 000000000..edf4de653 --- /dev/null +++ b/main/SS/UserModel/Charts/AreaChartSeries.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NPOI.SS.UserModel.Charts +{ + public interface IAreaChartSeries : IChartSeries + { + /// + /// Return data source used for category axis data. + /// + IChartDataSource GetCategoryAxisData(); + + /// + /// Return data source used for value axis. + /// + IChartDataSource GetValues(); + } +} diff --git a/main/SS/UserModel/Charts/BarChartData.cs b/main/SS/UserModel/Charts/BarChartData.cs index 0896ffe69..a6bbcc6d0 100644 --- a/main/SS/UserModel/Charts/BarChartData.cs +++ b/main/SS/UserModel/Charts/BarChartData.cs @@ -11,7 +11,12 @@ namespace NPOI.SS.UserModel.Charts /// public interface IBarChartData : IChartData { - + /// + /// Adds the series. + /// + /// The categories data source. + /// The values data source. + /// Created series. IBarChartSeries AddSeries(IChartDataSource categories, IChartDataSource values); /** diff --git a/main/SS/UserModel/Charts/ChartDataFactory.cs b/main/SS/UserModel/Charts/ChartDataFactory.cs index ecffe6602..5c3b637d1 100644 --- a/main/SS/UserModel/Charts/ChartDataFactory.cs +++ b/main/SS/UserModel/Charts/ChartDataFactory.cs @@ -32,6 +32,9 @@ public interface IChartDataFactory IScatterChartData CreateScatterChartData(); ILineChartData CreateLineChartData(); IBarChartData CreateBarChartData(); + IPieChartData CreatePieChartData(); + IColumnChartData CreateColumnChartData(); + IAreaChartData CreateAreaChartData(); } } diff --git a/main/SS/UserModel/Charts/ColumnChartData.cs b/main/SS/UserModel/Charts/ColumnChartData.cs new file mode 100644 index 000000000..cd0381552 --- /dev/null +++ b/main/SS/UserModel/Charts/ColumnChartData.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NPOI.SS.UserModel.Charts +{ + /// + /// Data for a Column Chart + /// + public interface IColumnChartData : IChartData + { + /// + /// Adds the series. + /// + /// The categories data source. + /// The values data source. + /// Created series. + IColumnChartSeries AddSeries(IChartDataSource categories, IChartDataSource values); + + /// + /// Returns list of all series. + /// + List> GetSeries(); + } +} diff --git a/main/SS/UserModel/Charts/ColumnChartSeries.cs b/main/SS/UserModel/Charts/ColumnChartSeries.cs new file mode 100644 index 000000000..4e055aa31 --- /dev/null +++ b/main/SS/UserModel/Charts/ColumnChartSeries.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NPOI.SS.UserModel.Charts +{ + public interface IColumnChartSeries : IChartSeries + { + /// + /// Return data source used for category axis data. + /// + IChartDataSource GetCategoryAxisData(); + + /// + /// Return data source used for value axis. + /// + IChartDataSource GetValues(); + } +} diff --git a/main/SS/UserModel/Charts/PieChartData.cs b/main/SS/UserModel/Charts/PieChartData.cs new file mode 100644 index 000000000..bd7ea0a40 --- /dev/null +++ b/main/SS/UserModel/Charts/PieChartData.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NPOI.SS.UserModel.Charts +{ + /// + /// Data for a Pie Chart + /// + public interface IPieChartData : IChartData + { + /// + /// Adds the series. + /// + /// The categories data source. + /// The values data source. + /// Created series. + IPieChartSeries AddSeries(IChartDataSource categories, IChartDataSource values); + + /// + /// Return list of all series. + /// + List> GetSeries(); + } +} diff --git a/main/SS/UserModel/Charts/PieChartSeries.cs b/main/SS/UserModel/Charts/PieChartSeries.cs new file mode 100644 index 000000000..6a73a9259 --- /dev/null +++ b/main/SS/UserModel/Charts/PieChartSeries.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NPOI.SS.UserModel.Charts +{ + public interface IPieChartSeries : IChartSeries + { + /// + /// Return data source used for category axis data. + /// + IChartDataSource GetCategoryAxisData(); + + /// + /// Return data source used for value axis. + /// + IChartDataSource GetValues(); + + } +} diff --git a/main/SS/UserModel/Charts/ScatterChartData.cs b/main/SS/UserModel/Charts/ScatterChartData.cs index 1ddb36d82..fe2b5e9a1 100644 --- a/main/SS/UserModel/Charts/ScatterChartData.cs +++ b/main/SS/UserModel/Charts/ScatterChartData.cs @@ -33,6 +33,8 @@ public interface IScatterChartData : IChartData */ IScatterChartSeries AddSeries(IChartDataSource xs, IChartDataSource ys); + IScatterChartSeries AddSeries(IChartDataSource values); + /** * @return list of all series */ diff --git a/ooxml/NPOI.OOXML.csproj b/ooxml/NPOI.OOXML.csproj index 0be31dc1b..7799463b6 100644 --- a/ooxml/NPOI.OOXML.csproj +++ b/ooxml/NPOI.OOXML.csproj @@ -176,6 +176,7 @@ + @@ -188,11 +189,13 @@ Code + Code + Code diff --git a/ooxml/XSSF/UserModel/Charts/XSSFAreaChartData.cs b/ooxml/XSSF/UserModel/Charts/XSSFAreaChartData.cs new file mode 100644 index 000000000..a6843a418 --- /dev/null +++ b/ooxml/XSSF/UserModel/Charts/XSSFAreaChartData.cs @@ -0,0 +1,151 @@ +using NPOI.OpenXmlFormats.Dml; +using NPOI.OpenXmlFormats.Dml.Chart; +using NPOI.SS.UserModel.Charts; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; + +namespace NPOI.XSSF.UserModel.Charts +{ + /// + /// Holds data for a XSSF Area Chart + /// + /// + /// + public class XSSFAreaChartData : IAreaChartData + { + /** + * List of all data series. + */ + private List> series; + + public XSSFAreaChartData() + { + series = new List>(); + } + + public class Series : AbstractXSSFChartSeries, IAreaChartSeries + { + private int id; + private int order; + private byte[] fillColor; + private IChartDataSource categories; + private IChartDataSource values; + + internal Series(int id, int order, + IChartDataSource categories, + IChartDataSource values) + { + this.id = id; + this.order = order; + this.categories = categories; + this.values = values; + } + + public void SetId(int id) + { + this.id = id; + } + + public void SetOrder(int order) + { + this.order = order; + } + + public void SetFillColor(Color color) + { + fillColor = new byte[3]; + fillColor[0] = color.R; + fillColor[1] = color.G; + fillColor[2] = color.B; + } + + public IChartDataSource GetCategoryAxisData() + { + return categories; + } + + public IChartDataSource GetValues() + { + return values; + } + + internal void AddToChart(CT_AreaChart ctAreaChart) + { + CT_AreaSer ctAreaSer = ctAreaChart.AddNewSer(); + //TODO: resolve grouping + //CT_BarGrouping ctGrouping = ctAreaSer.AddNewGrouping(); + //ctGrouping.val = ST_BarGrouping.clustered; + ctAreaSer.AddNewIdx().val = (uint)id; + ctAreaSer.AddNewOrder().val = (uint)order; + //TODO: resolve negative + //CT_Boolean ctNoInvertIfNegative = new CT_Boolean(); + //ctNoInvertIfNegative.val = 0; + //ctAreaSer.invertIfNegative = ctNoInvertIfNegative; + + CT_AxDataSource catDS = ctAreaSer.AddNewCat(); + XSSFChartUtil.BuildAxDataSource(catDS, categories); + CT_NumDataSource valueDS = ctAreaSer.AddNewVal(); + XSSFChartUtil.BuildNumDataSource(valueDS, values); + + if (IsTitleSet) + { + ctAreaSer.tx = GetCTSerTx(); + } + + if (fillColor != null) + { + ctAreaSer.spPr = new NPOI.OpenXmlFormats.Dml.Chart.CT_ShapeProperties(); + CT_SolidColorFillProperties ctSolidColorFillProperties = ctAreaSer.spPr.AddNewSolidFill(); + CT_SRgbColor ctSRgbColor = ctSolidColorFillProperties.AddNewSrgbClr(); + ctSRgbColor.val = fillColor; + } + } + } + + public IAreaChartSeries AddSeries(IChartDataSource categoryAxisData, IChartDataSource values) + { + if (!values.IsNumeric) + { + throw new ArgumentException("Value data source must be numeric."); + } + int numOfSeries = series.Count; + Series newSeries = new Series(numOfSeries, numOfSeries, categoryAxisData, values); + series.Add(newSeries); + return newSeries; + } + + public List> GetSeries() + { + return series; + } + + public void FillChart(SS.UserModel.IChart chart, params IChartAxis[] axis) + { + if (!(chart is XSSFChart)) + { + throw new ArgumentException("Chart must be instance of XSSFChart"); + } + + XSSFChart xssfChart = (XSSFChart)chart; + CT_PlotArea plotArea = xssfChart.GetCTChart().plotArea; + int allSeriesCount = plotArea.GetAllSeriesCount(); + CT_AreaChart areaChart = plotArea.AddNewAreaChart(); + areaChart.AddNewVaryColors().val = 0; + + for (int i = 0; i < series.Count; ++i) + { + Series s = (Series)series[i]; + s.SetId(allSeriesCount + i); + s.SetOrder(allSeriesCount + i); + s.AddToChart(areaChart); + } + + foreach (IChartAxis ax in axis) + { + areaChart.AddNewAxId().val = (uint)ax.Id; + } + } + } +} diff --git a/ooxml/XSSF/UserModel/Charts/XSSFBarChartData.cs b/ooxml/XSSF/UserModel/Charts/XSSFBarChartData.cs index d6f8f0bac..3a23cbc1f 100644 --- a/ooxml/XSSF/UserModel/Charts/XSSFBarChartData.cs +++ b/ooxml/XSSF/UserModel/Charts/XSSFBarChartData.cs @@ -9,7 +9,7 @@ namespace NPOI.XSSF.UserModel.Charts { /// - /// Holds data for a XSSF Line Chart + /// Holds data for a XSSF Bar Chart /// /// /// @@ -34,8 +34,8 @@ public class Series : AbstractXSSFChartSeries, IBarChartSeries private IChartDataSource values; internal Series(int id, int order, - IChartDataSource categories, - IChartDataSource values) + IChartDataSource categories, + IChartDataSource values) { this.id = id; this.order = order; @@ -83,7 +83,7 @@ internal void AddToChart(CT_BarChart ctBarChart) ctBarSer.invertIfNegative = ctNoInvertIfNegative; CT_BarDir ctBarDir = ctBarChart.AddNewBarDir(); - ctBarDir.val = ST_BarDir.col; + ctBarDir.val = ST_BarDir.bar; CT_AxDataSource catDS = ctBarSer.AddNewCat(); XSSFChartUtil.BuildAxDataSource(catDS, categories); diff --git a/ooxml/XSSF/UserModel/Charts/XSSFChartDataFactory.cs b/ooxml/XSSF/UserModel/Charts/XSSFChartDataFactory.cs index b5ca2d70a..a7115e974 100644 --- a/ooxml/XSSF/UserModel/Charts/XSSFChartDataFactory.cs +++ b/ooxml/XSSF/UserModel/Charts/XSSFChartDataFactory.cs @@ -50,6 +50,21 @@ public IBarChartData CreateBarChartData() { return new XSSFBarChartData(); } + + public IPieChartData CreatePieChartData() + { + return new XSSFPieChartData(); + } + + public IColumnChartData CreateColumnChartData() + { + return new XSSFColumnChartData(); + } + + public IAreaChartData CreateAreaChartData() + { + return new XSSFAreaChartData(); + } /** * @return factory instance */ diff --git a/ooxml/XSSF/UserModel/Charts/XSSFColumnChartData.cs b/ooxml/XSSF/UserModel/Charts/XSSFColumnChartData.cs new file mode 100644 index 000000000..89ff84d05 --- /dev/null +++ b/ooxml/XSSF/UserModel/Charts/XSSFColumnChartData.cs @@ -0,0 +1,152 @@ +using NPOI.OpenXmlFormats.Dml; +using NPOI.OpenXmlFormats.Dml.Chart; +using NPOI.SS.UserModel.Charts; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; + +namespace NPOI.XSSF.UserModel.Charts +{ + /// + /// Holds data for a XSSF Column Chart + /// + /// + /// + public class XSSFColumnChartData : IColumnChartData + { + /** + * List of all data series. + */ + private List> series; + + public XSSFColumnChartData() + { + series = new List>(); + } + + public class Series : AbstractXSSFChartSeries, IColumnChartSeries + { + private int id; + private int order; + private byte[] fillColor; + private IChartDataSource categories; + private IChartDataSource values; + + internal Series(int id, int order, + IChartDataSource categories, + IChartDataSource values) + { + this.id = id; + this.order = order; + this.categories = categories; + this.values = values; + } + + public void SetId(int id) + { + this.id = id; + } + + public void SetOrder(int order) + { + this.order = order; + } + + public void SetFillColor(Color color) + { + fillColor = new byte[3]; + fillColor[0] = color.R; + fillColor[1] = color.G; + fillColor[2] = color.B; + } + + public IChartDataSource GetCategoryAxisData() + { + return categories; + } + + public IChartDataSource GetValues() + { + return values; + } + + internal void AddToChart(CT_BarChart ctBarChart) + { + CT_BarSer ctBarSer = ctBarChart.AddNewSer(); + CT_BarGrouping ctGrouping = ctBarChart.AddNewGrouping(); + ctGrouping.val = ST_BarGrouping.clustered; + ctBarSer.AddNewIdx().val = (uint)id; + ctBarSer.AddNewOrder().val = (uint)order; + CT_Boolean ctNoInvertIfNegative = new CT_Boolean(); + ctNoInvertIfNegative.val = 0; + ctBarSer.invertIfNegative = ctNoInvertIfNegative; + + CT_BarDir ctBarDir = ctBarChart.AddNewBarDir(); + ctBarDir.val = ST_BarDir.col; + + CT_AxDataSource catDS = ctBarSer.AddNewCat(); + XSSFChartUtil.BuildAxDataSource(catDS, categories); + CT_NumDataSource valueDS = ctBarSer.AddNewVal(); + XSSFChartUtil.BuildNumDataSource(valueDS, values); + + if (IsTitleSet) + { + ctBarSer.tx = GetCTSerTx(); + } + + if (fillColor != null) + { + ctBarSer.spPr = new NPOI.OpenXmlFormats.Dml.Chart.CT_ShapeProperties(); + CT_SolidColorFillProperties ctSolidColorFillProperties = ctBarSer.spPr.AddNewSolidFill(); + CT_SRgbColor ctSRgbColor = ctSolidColorFillProperties.AddNewSrgbClr(); + ctSRgbColor.val = fillColor; + } + } + } + + public IColumnChartSeries AddSeries(IChartDataSource categoryAxisData, IChartDataSource values) + { + if (!values.IsNumeric) + { + throw new ArgumentException("Value data source must be numeric."); + } + int numOfSeries = series.Count; + Series newSeries = new Series(numOfSeries, numOfSeries, categoryAxisData, values); + series.Add(newSeries); + return newSeries; + } + + public List> GetSeries() + { + return series; + } + + public void FillChart(SS.UserModel.IChart chart, params IChartAxis[] axis) + { + if (!(chart is XSSFChart)) + { + throw new ArgumentException("Chart must be instance of XSSFChart"); + } + + XSSFChart xssfChart = (XSSFChart)chart; + CT_PlotArea plotArea = xssfChart.GetCTChart().plotArea; + int allSeriesCount = plotArea.GetAllSeriesCount(); + CT_BarChart barChart = plotArea.AddNewBarChart(); + barChart.AddNewVaryColors().val = 0; + + for (int i = 0; i < series.Count; ++i) + { + Series s = (Series)series[i]; + s.SetId(allSeriesCount + i); + s.SetOrder(allSeriesCount + i); + s.AddToChart(barChart); + } + + foreach (IChartAxis ax in axis) + { + barChart.AddNewAxId().val = (uint)ax.Id; + } + } + } +} diff --git a/ooxml/XSSF/UserModel/Charts/XSSFPieChartData.cs b/ooxml/XSSF/UserModel/Charts/XSSFPieChartData.cs new file mode 100644 index 000000000..779562f33 --- /dev/null +++ b/ooxml/XSSF/UserModel/Charts/XSSFPieChartData.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NPOI.OpenXmlFormats.Dml; +using NPOI.OpenXmlFormats.Dml.Chart; +using NPOI.SS.UserModel.Charts; + +namespace NPOI.XSSF.UserModel.Charts +{ + /// + /// Holds data for a XSSF Pie Chart + /// + /// + /// + public class XSSFPieChartData : IPieChartData + { + /// + /// List of all data series. + /// + private List> series; + + public XSSFPieChartData() + { + series = new List>(); + } + + public class Series : AbstractXSSFChartSeries, IPieChartSeries + { + private int id; + private int order; + private byte[] fillColor; + private IChartDataSource categories; + private IChartDataSource values; + + internal Series(int id, int order, + IChartDataSource categories, + IChartDataSource values) + { + this.id = id; + this.order = order; + this.categories = categories; + this.values = values; + } + + public void SetId(int id) + { + this.id = id; + } + + public void SetOrder(int order) + { + this.order = order; + } + + public IChartDataSource GetCategoryAxisData() + { + return categories; + } + + public IChartDataSource GetValues() + { + return values; + } + + internal void AddToChart(CT_PieChart ctPieChart) + { + CT_PieSer ctPieSer = ctPieChart.AddNewSer(); + ctPieSer.AddNewIdx().val = (uint) id; + ctPieSer.AddNewOrder().val = (uint) order; + + CT_AxDataSource catDS = ctPieSer.AddNewCat(); + XSSFChartUtil.BuildAxDataSource(catDS, categories); + for (var i = 0; i < categories.PointCount; i++) + { + var accentIndex = (i % 6) + 4; + var colorVal = (ST_SchemeColorVal)Enum.Parse(typeof(ST_SchemeColorVal), accentIndex.ToString()); + var schemeColor = new CT_SchemeColor {val = colorVal}; + schemeColor.AddNewLum(i); + var solidFill = new CT_SolidColorFillProperties {schemeClr = schemeColor}; + var shapeProperties = new NPOI.OpenXmlFormats.Dml.Chart.CT_ShapeProperties {solidFill = solidFill}; + var dPt = new CT_DPt + { + spPr = shapeProperties, + idx = new CT_UnsignedInt {val = (uint) i}, + }; + + ctPieSer.dPt.Add(dPt); + } + + CT_NumDataSource valueDS = ctPieSer.AddNewVal(); + XSSFChartUtil.BuildNumDataSource(valueDS, values); + + if (IsTitleSet) + { + ctPieSer.tx = GetCTSerTx(); + } + } + } + + public IPieChartSeries AddSeries(IChartDataSource categoryAxisData, IChartDataSource values) + { + if (!values.IsNumeric) + { + throw new ArgumentException("Value data source must be numeric."); + } + int numOfSeries = series.Count; + Series newSeries = new Series(numOfSeries, numOfSeries, categoryAxisData, values); + series.Add(newSeries); + return newSeries; + } + + public List> GetSeries() + { + return series; + } + + public void FillChart(SS.UserModel.IChart chart, params IChartAxis[] axis) + { + if (!(chart is XSSFChart)) + { + throw new ArgumentException("Chart must be instance of XSSFChart"); + } + + XSSFChart xssfChart = (XSSFChart)chart; + CT_PlotArea plotArea = xssfChart.GetCTChart().plotArea; + int allSeriesCount = plotArea.GetAllSeriesCount(); + + CT_PieChart pieChart = plotArea.AddNewPieChart(); + pieChart.AddNewVaryColors().val = 0; + + for (int i = 0; i < series.Count; ++i) + { + Series s = (Series)series[i]; + s.SetId(allSeriesCount + i); + s.SetOrder(allSeriesCount + i); + s.AddToChart(pieChart); + } + } + } +} diff --git a/ooxml/XSSF/UserModel/Charts/XSSFScatterChartData.cs b/ooxml/XSSF/UserModel/Charts/XSSFScatterChartData.cs index 85d44daf5..854d20936 100644 --- a/ooxml/XSSF/UserModel/Charts/XSSFScatterChartData.cs +++ b/ooxml/XSSF/UserModel/Charts/XSSFScatterChartData.cs @@ -113,8 +113,11 @@ internal void AddToChart(CT_ScatterChart ctScatterChart) scatterSer.AddNewIdx().val = (uint)this.id; scatterSer.AddNewOrder().val = (uint)this.order; - CT_AxDataSource xVal = scatterSer.AddNewXVal(); - XSSFChartUtil.BuildAxDataSource(xVal, xs); + if (xs != null) + { + CT_AxDataSource xVal = scatterSer.AddNewXVal(); + XSSFChartUtil.BuildAxDataSource(xVal, xs); + } CT_NumDataSource yVal = scatterSer.AddNewYVal(); XSSFChartUtil.BuildNumDataSource(yVal, ys); @@ -137,6 +140,11 @@ public IScatterChartSeries AddSeries(IChartDataSource xs, IChartDataS return newSerie; } + public IScatterChartSeries AddSeries(IChartDataSource values) + { + return AddSeries(null, values); + } + public void FillChart(IChart chart, IChartAxis[] axis) { if (!(chart is XSSFChart)) @@ -171,6 +179,7 @@ public List> GetSeries() private void AddStyle(CT_ScatterChart ctScatterChart) { + ctScatterChart.varyColors = new CT_Boolean { val = 0 }; CT_ScatterStyle scatterStyle = ctScatterChart.AddNewScatterStyle(); scatterStyle.val = ST_ScatterStyle.lineMarker; } diff --git a/ooxml/XSSF/UserModel/XSSFChart.cs b/ooxml/XSSF/UserModel/XSSFChart.cs index 517765a0d..4ec111a32 100644 --- a/ooxml/XSSF/UserModel/XSSFChart.cs +++ b/ooxml/XSSF/UserModel/XSSFChart.cs @@ -97,6 +97,7 @@ protected XSSFChart(PackagePart part, PackageRelationship rel) private void CreateChart() { chartSpaceDocument = new ChartSpaceDocument(); + chartSpaceDocument.GetChartSpace().roundedCorners = new CT_Boolean {val = 0}; chart = chartSpaceDocument.GetChartSpace().AddNewChart(); CT_PlotArea plotArea = chart.AddNewPlotArea();