Manipulate individual data point properties

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1886642 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Alain Béarez 2021-02-17 22:05:18 +00:00
parent 36277f9e54
commit b20ca985b8
18 changed files with 319 additions and 4 deletions

View File

@ -110,6 +110,7 @@ public final class PieChartDemo {
firstSeries.replaceData(categoriesData, valuesData);
firstSeries.setTitle(chartTitle, chart.setSheetTitle(chartTitle, 0));
firstSeries.setExplosion(25L);
firstSeries.getDataPoint(1).setExplosion(35L);
chart.plot(pie);
// save the result

View File

@ -166,10 +166,15 @@ public final class BarAndLineChart {
// some colors
XDDFFillProperties solidChartreuse = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.CHARTREUSE));
XDDFFillProperties solidTurquoise = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.TURQUOISE));
XDDFLineProperties solidLines = new XDDFLineProperties(solidTurquoise);
XDDFLineProperties linesChartreuse = new XDDFLineProperties(solidChartreuse);
XDDFLineProperties linesTurquoise = new XDDFLineProperties(solidTurquoise);
series1.setFillProperties(solidChartreuse);
series1.setLineProperties(solidLines); // bar border color different from fill
series2.setLineProperties(solidLines);
series1.setLineProperties(linesTurquoise); // bar border color different from fill
series1.getDataPoint(2).setFillProperties(solidTurquoise); // this specific bar has inverted colors
series1.getDataPoint(2).setLineProperties(linesChartreuse);
series2.setLineProperties(linesTurquoise);
series2.getDataPoint(2).setMarkerStyle(MarkerStyle.STAR);
series2.getDataPoint(2).setLineProperties(linesChartreuse);
// legend
XDDFChartLegend legend = chart.getOrAddLegend();

View File

@ -17,6 +17,7 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.Map;
import org.apache.poi.ooxml.util.POIXMLUnits;
@ -26,6 +27,7 @@ import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTArea3DChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAreaSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
@ -212,5 +214,10 @@ public class XDDFArea3DChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -17,6 +17,7 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.Map;
import org.apache.poi.util.Beta;
@ -25,6 +26,7 @@ import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAreaChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAreaSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
@ -193,5 +195,10 @@ public class XDDFAreaChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -17,6 +17,7 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.Map;
import org.apache.poi.ooxml.util.POIXMLUnits;
@ -26,6 +27,7 @@ import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBar3DChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
@ -320,5 +322,10 @@ public class XDDFBar3DChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -17,6 +17,7 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.Map;
import org.apache.poi.ooxml.util.POIXMLUnits;
@ -26,6 +27,7 @@ import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
@ -310,5 +312,10 @@ public class XDDFBarChartData extends XDDFChartData {
protected void setOrder(long order) {
series.getOrder().setVal(order);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -30,6 +30,7 @@ import org.apache.poi.xddf.usermodel.XDDFFillProperties;
import org.apache.poi.xddf.usermodel.XDDFLineProperties;
import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
@ -157,6 +158,8 @@ public abstract class XDDFChartData {
protected abstract void setOrder(long order);
protected abstract List<CTDPt> getDPtList();
protected Series(XDDFDataSource<?> category, XDDFNumericalDataSource<? extends Number> values) {
replaceData(category, values);
}
@ -251,6 +254,53 @@ public abstract class XDDFChartData {
setShapeProperties(properties);
}
/**
* If a data point definition with the given <code>index</code> exists, then remove it.
* Otherwise do nothing.
*
* @param index
* data point index.
* @since POI 5.0.1
*/
public void clearDataPoint(long index) {
List<CTDPt> points = getDPtList();
for (int i = 0; i < points.size(); i++) {
if (points.get(i).getIdx().getVal() == index) {
points.remove(i);
i = points.size();
}
}
}
/**
* If a data point definition with the given <code>index</code> exists, then return it.
* Otherwise create a new data point definition and return it.
*
* @param index
* data point index.
* @return
* the data point with the given <code>index</code>.
* @since POI 5.0.1
*/
public XDDFDataPoint getDataPoint(long index) {
List<CTDPt> points = getDPtList();
for (int i = 0; i < points.size(); i++) {
if (points.get(i).getIdx().getVal() == index) {
return new XDDFDataPoint(points.get(i));
}
if (points.get(i).getIdx().getVal() > index) {
points.add(i, CTDPt.Factory.newInstance());
CTDPt point = points.get(i);
point.addNewIdx().setVal(index);
return new XDDFDataPoint(point);
}
}
points.add(CTDPt.Factory.newInstance());
CTDPt point = points.get(points.size() - 1);
point.addNewIdx().setVal(index);
return new XDDFDataPoint(point);
}
private CTNumData retrieveNumCache(final CTAxDataSource axDataSource, XDDFDataSource<?> data) {
CTNumData numCache;
if (data.isReference()) {

View File

@ -0,0 +1,164 @@
/*
* ====================================================================
* 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.XDDFFillProperties;
import org.apache.poi.xddf.usermodel.XDDFLineProperties;
import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTMarker;
/**
* @since 5.0.1
*/
@Beta
public class XDDFDataPoint {
private final CTDPt point;
@Internal
protected XDDFDataPoint(CTDPt point) {
this.point = point;
}
public long getIndex() {
return point.getIdx().getVal();
}
/**
* @param fill
* fill property for the shape representing the point.
*/
public void setFillProperties(XDDFFillProperties fill) {
XDDFShapeProperties properties = getShapeProperties();
if (properties == null) {
properties = new XDDFShapeProperties();
}
properties.setFillProperties(fill);
setShapeProperties(properties);
}
/**
* @param line
* line property for the shape representing the point.
*/
public void setLineProperties(XDDFLineProperties line) {
XDDFShapeProperties properties = getShapeProperties();
if (properties == null) {
properties = new XDDFShapeProperties();
}
properties.setLineProperties(line);
setShapeProperties(properties);
}
public XDDFShapeProperties getShapeProperties() {
if (point.isSetSpPr()) {
return new XDDFShapeProperties(point.getSpPr());
} else {
return null;
}
}
public void setShapeProperties(XDDFShapeProperties properties) {
if (properties == null) {
if (point.isSetSpPr()) {
point.unsetSpPr();
}
} else {
if (point.isSetSpPr()) {
point.setSpPr(properties.getXmlObject());
} else {
point.addNewSpPr().set(properties.getXmlObject());
}
}
}
public Long getExplosion() {
if (point.isSetExplosion()) {
return point.getExplosion().getVal();
} else {
return null;
}
}
public void setExplosion(Long explosion) {
if (explosion == null) {
if (point.isSetExplosion()) {
point.unsetExplosion();
}
} else {
if (point.isSetExplosion()) {
point.getExplosion().setVal(explosion);
} else {
point.addNewExplosion().setVal(explosion);
}
}
}
public boolean getInvertIfNegative() {
if (point.isSetInvertIfNegative()) {
return point.getInvertIfNegative().getVal();
}
return false;
}
public void setInvertIfNegative(boolean invertIfNegative) {
if (point.isSetInvertIfNegative()) {
point.getInvertIfNegative().setVal(invertIfNegative);
} else {
point.addNewInvertIfNegative().setVal(invertIfNegative);
}
}
/**
* @param size
* <dl><dt>Minimum inclusive:</dt><dd>2</dd><dt>Maximum inclusive:</dt><dd>72</dd></dl>
*/
public void setMarkerSize(short size) {
if (size < 2 || 72 < size) {
throw new IllegalArgumentException("Minimum inclusive: 2; Maximum inclusive: 72");
}
CTMarker marker = getMarker();
if (marker.isSetSize()) {
marker.getSize().setVal(size);
} else {
marker.addNewSize().setVal(size);
}
}
public void setMarkerStyle(MarkerStyle style) {
CTMarker marker = getMarker();
if (marker.isSetSymbol()) {
marker.getSymbol().setVal(style.underlying);
} else {
marker.addNewSymbol().setVal(style.underlying);
}
}
private CTMarker getMarker() {
if (point.isSetMarker()) {
return point.getMarker();
} else {
return point.addNewMarker();
}
}
}

View File

@ -17,11 +17,14 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import org.apache.poi.ooxml.util.POIXMLUnits;
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.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDoughnutChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
@ -225,5 +228,10 @@ public class XDDFDoughnutChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -17,6 +17,7 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.Map;
import org.apache.poi.ooxml.util.POIXMLUnits;
@ -24,6 +25,7 @@ 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.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLine3DChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTMarker;
@ -299,5 +301,10 @@ public class XDDFLine3DChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -17,12 +17,14 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.Map;
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.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTMarker;
@ -282,5 +284,10 @@ public class XDDFLineChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -17,10 +17,13 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
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.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPie3DChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
@ -174,5 +177,10 @@ public class XDDFPie3DChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -17,10 +17,13 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
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.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
@ -199,5 +202,10 @@ public class XDDFPieChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -17,12 +17,14 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.Map;
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.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTRadarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTRadarSer;
@ -184,5 +186,10 @@ public class XDDFRadarChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -17,12 +17,14 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.Map;
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.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTMarker;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterChart;
@ -292,5 +294,10 @@ public class XDDFScatterChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
return series.getDPtList();
}
}
}

View File

@ -17,12 +17,14 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.Map;
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.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSurface3DChart;
@ -186,5 +188,10 @@ public class XDDFSurface3DChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
throw new IllegalStateException("Surface data series don't support data point settings.");
}
}
}

View File

@ -17,12 +17,14 @@
package org.apache.poi.xddf.usermodel.chart;
import java.util.List;
import java.util.Map;
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.CTDPt;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSurfaceChart;
@ -186,5 +188,10 @@ public class XDDFSurfaceChartData extends XDDFChartData {
protected void setOrder(long val) {
series.getOrder().setVal(val);
}
@Override
protected List<CTDPt> getDPtList() {
throw new IllegalStateException("Surface data series don't support data point settings.");
}
}
}
}

View File

@ -178,6 +178,7 @@ class TestNecessaryOOXMLClasses {
assertNotNull(CTErrValType.Factory.newInstance());
assertNotNull(CTErrDir.Factory.newInstance());
assertNotNull(CTHoleSize.Factory.newInstance());
assertNotNull(CTDPt.Factory.newInstance());
STErrBarType.Enum e9 = STErrBarType.Enum.forString("both");
assertNotNull(e9);