From 4f8aeb705ef1ce252201646e4aa5a89312f8be5f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alain=20B=C3=A9arez?= Date: Sat, 30 Nov 2019 15:46:48 +0000 Subject: [PATCH] Add Doughnut chart data series to XDDF git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1870628 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xddf/usermodel/chart/ChartTypes.java | 1 + .../poi/xddf/usermodel/chart/XDDFChart.java | 12 +- .../chart/XDDFDoughnutChartData.java | 172 ++++++++++++++++++ .../usermodel/TestNecessaryOOXMLClasses.java | 2 + 4 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDoughnutChartData.java diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/ChartTypes.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/ChartTypes.java index fcec761933..7f822abbb8 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/ChartTypes.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/ChartTypes.java @@ -21,6 +21,7 @@ public enum ChartTypes { AREA3D, BAR, BAR3D, + DOUGHNUT, LINE, LINE3D, PIE, diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java index f3c0d96a4d..aded9fdca5 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java @@ -65,6 +65,7 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx; import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace; import org.openxmlformats.schemas.drawingml.x2006.chart.CTDateAx; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTDoughnutChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTLine3DChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart; import org.openxmlformats.schemas.drawingml.x2006.chart.CTPie3DChart; @@ -426,6 +427,11 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai series.add(new XDDFBar3DChartData(this, barChart, categories, values)); } + for (int i = 0; i < plotArea.sizeOfDoughnutChartArray(); i++) { + CTDoughnutChart doughnutChart = plotArea.getDoughnutChartArray(i); + series.add(new XDDFDoughnutChartData(this, doughnutChart)); + } + for (int i = 0; i < plotArea.sizeOfLineChartArray(); i++) { CTLineChart lineChart = plotArea.getLineChartArray(i); series.add(new XDDFLineChartData(this, lineChart, categories, values)); @@ -465,7 +471,7 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai CTSurface3DChart surfaceChart = plotArea.getSurface3DChartArray(i); series.add(new XDDFSurface3DChartData(this, surfaceChart, categories, values)); } - // TODO repeat above code for missing charts: Bubble, Doughnut, OfPie and Stock + // TODO repeat above code for missing charts: Bubble, OfPie and Stock seriesCount = series.size(); return series; @@ -578,6 +584,8 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai return new XDDFBarChartData(this, plotArea.addNewBarChart(), categories, mapValues); case BAR3D: return new XDDFBar3DChartData(this, plotArea.addNewBar3DChart(), categories, mapValues); + case DOUGHNUT: + return new XDDFDoughnutChartData(this, plotArea.addNewDoughnutChart()); case LINE: return new XDDFLineChartData(this, plotArea.addNewLineChart(), categories, mapValues); case LINE3D: @@ -594,7 +602,7 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai return new XDDFSurfaceChartData(this, plotArea.addNewSurfaceChart(), categories, mapValues); case SURFACE3D: return new XDDFSurface3DChartData(this, plotArea.addNewSurface3DChart(), categories, mapValues); - // TODO repeat above code for missing charts: Bubble, Doughnut, OfPie and Stock + // TODO repeat above code for missing charts: Bubble, OfPie and Stock default: return null; } diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDoughnutChartData.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDoughnutChartData.java new file mode 100644 index 0000000000..b0ac5f9dd6 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDoughnutChartData.java @@ -0,0 +1,172 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.xddf.usermodel.chart; + +import org.apache.poi.util.Beta; +import org.apache.poi.util.Internal; +import org.apache.poi.xddf.usermodel.XDDFShapeProperties; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTDoughnutChart; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx; + +@Beta +public class XDDFDoughnutChartData extends XDDFChartData { + private CTDoughnutChart chart; + + @Internal + protected XDDFDoughnutChartData(XDDFChart parent, CTDoughnutChart chart) { + super(parent); + this.chart = chart; + for (CTPieSer series : chart.getSerList()) { + this.series.add(new Series(series, series.getCat(), series.getVal())); + } + } + + @Internal + @Override + protected void removeCTSeries(int n) { + chart.removeSer(n); + } + + @Override + public void setVaryColors(Boolean varyColors) { + if (varyColors == null) { + if (chart.isSetVaryColors()) { + chart.unsetVaryColors(); + } + } else { + if (chart.isSetVaryColors()) { + chart.getVaryColors().setVal(varyColors); + } else { + chart.addNewVaryColors().setVal(varyColors); + } + } + } + + @Override + public XDDFChartData.Series addSeries(XDDFDataSource category, + XDDFNumericalDataSource values) { + final int index = this.series.size(); + final CTPieSer ctSer = this.chart.addNewSer(); + ctSer.addNewCat(); + ctSer.addNewVal(); + ctSer.addNewIdx().setVal(index); + ctSer.addNewOrder().setVal(index); + final Series added = new Series(ctSer, category, values); + this.series.add(added); + return added; + } + + public class Series extends XDDFChartData.Series { + private CTPieSer series; + + protected Series(CTPieSer series, XDDFDataSource category, + XDDFNumericalDataSource values) { + super(category, values); + this.series = series; + } + + protected Series(CTPieSer series, CTAxDataSource category, CTNumDataSource values) { + super(XDDFDataSourcesFactory.fromDataSource(category), XDDFDataSourcesFactory.fromDataSource(values)); + this.series = series; + } + + @Override + protected CTSerTx getSeriesText() { + if (series.isSetTx()) { + return series.getTx(); + } else { + return series.addNewTx(); + } + } + + @Override + public void setShowLeaderLines(boolean showLeaderLines) { + if (!series.isSetDLbls()) { + series.addNewDLbls(); + } + if (series.getDLbls().isSetShowLeaderLines()) { + series.getDLbls().getShowLeaderLines().setVal(showLeaderLines); + } else { + series.getDLbls().addNewShowLeaderLines().setVal(showLeaderLines); + } + } + + @Override + public XDDFShapeProperties getShapeProperties() { + if (series.isSetSpPr()) { + return new XDDFShapeProperties(series.getSpPr()); + } else { + return null; + } + } + + @Override + public void setShapeProperties(XDDFShapeProperties properties) { + if (properties == null) { + if (series.isSetSpPr()) { + series.unsetSpPr(); + } + } else { + if (series.isSetSpPr()) { + series.setSpPr(properties.getXmlObject()); + } else { + series.addNewSpPr().set(properties.getXmlObject()); + } + } + } + + public long getExplosion() { + if (series.isSetExplosion()) { + return series.getExplosion().getVal(); + } else { + return 0; + } + } + + public void setExplosion(long explosion) { + if (series.isSetExplosion()) { + series.getExplosion().setVal(explosion); + } else { + series.addNewExplosion().setVal(explosion); + } + } + + @Override + protected CTAxDataSource getAxDS() { + return series.getCat(); + } + + @Override + protected CTNumDataSource getNumDS() { + return series.getVal(); + } + + @Override + protected void setIndex(long val) { + series.getIdx().setVal(val); + } + + @Override + protected void setOrder(long val) { + series.getOrder().setVal(val); + } + } +} diff --git a/src/ooxml/testcases/org/apache/poi/xddf/usermodel/TestNecessaryOOXMLClasses.java b/src/ooxml/testcases/org/apache/poi/xddf/usermodel/TestNecessaryOOXMLClasses.java index e83f1679f7..c6e91add81 100644 --- a/src/ooxml/testcases/org/apache/poi/xddf/usermodel/TestNecessaryOOXMLClasses.java +++ b/src/ooxml/testcases/org/apache/poi/xddf/usermodel/TestNecessaryOOXMLClasses.java @@ -97,6 +97,8 @@ public class TestNecessaryOOXMLClasses { Assert.assertNotNull(ctArea3DChart); CTSurfaceChart ctSurfaceChart = CTSurfaceChart.Factory.newInstance(); Assert.assertNotNull(ctSurfaceChart); + CTDoughnutChart ctDoughnutChart = CTDoughnutChart.Factory.newInstance(); + Assert.assertNotNull(ctDoughnutChart); CTBar3DChart ctBar3DChart = CTBar3DChart.Factory.newInstance(); Assert.assertNotNull(ctBar3DChart); CTLine3DChart ctLine3DChart = CTLine3DChart.Factory.newInstance(); -- 2.39.5