git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1872692 13f79535-47bb-0310-9956-ffa450edef68tags/REL_4_1_2
@@ -33,11 +33,9 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt; | |||
/** | |||
@@ -211,16 +209,15 @@ public abstract class XDDFChartData { | |||
} | |||
public void plot() { | |||
int numOfPoints = categoryData.getPointCount(); | |||
if (categoryData.isNumeric()) { | |||
CTNumData cache = retrieveNumCache(getAxDS(), categoryData); | |||
fillNumCache(cache, numOfPoints, (XDDFNumericalDataSource<?>) categoryData); | |||
((XDDFNumericalDataSource<?>) categoryData).fillNumericalCache(cache); | |||
} else { | |||
CTStrData cache = retrieveStrCache(getAxDS(), categoryData); | |||
fillStringCache(cache, numOfPoints, categoryData); | |||
categoryData.fillStringCache(cache); | |||
} | |||
CTNumData cache = retrieveNumCache(getNumDS(), valuesData); | |||
fillNumCache(cache, numOfPoints, valuesData); | |||
valuesData.fillNumericalCache(cache); | |||
} | |||
/** | |||
@@ -343,61 +340,5 @@ public abstract class XDDFChartData { | |||
} | |||
return numCache; | |||
} | |||
private void fillStringCache(CTStrData cache, int numOfPoints, XDDFDataSource<?> data) { | |||
cache.setPtArray(null); // unset old values | |||
int effectiveNumOfPoints = 0; | |||
for (int i = 0; i < numOfPoints; ++i) { | |||
Object value = data.getPointAt(i); | |||
if (value != null) { | |||
CTStrVal ctStrVal = cache.addNewPt(); | |||
ctStrVal.setIdx(i); | |||
ctStrVal.setV(value.toString()); | |||
effectiveNumOfPoints++; | |||
} | |||
} | |||
if (effectiveNumOfPoints == 0) { | |||
if (cache.isSetPtCount()) { | |||
cache.unsetPtCount(); | |||
} | |||
} else { | |||
if (cache.isSetPtCount()) { | |||
cache.getPtCount().setVal(numOfPoints); | |||
} else { | |||
cache.addNewPtCount().setVal(numOfPoints); | |||
} | |||
} | |||
} | |||
private void fillNumCache(CTNumData cache, int numOfPoints, XDDFNumericalDataSource<?> data) { | |||
String formatCode = data.getFormatCode(); | |||
if (formatCode == null) { | |||
if (cache.isSetFormatCode()) { | |||
cache.unsetFormatCode(); | |||
} | |||
} else { | |||
cache.setFormatCode(formatCode); | |||
} | |||
cache.setPtArray(null); // unset old values | |||
int effectiveNumOfPoints = 0; | |||
for (int i = 0; i < numOfPoints; ++i) { | |||
Object value = data.getPointAt(i); | |||
if (value != null) { | |||
CTNumVal ctNumVal = cache.addNewPt(); | |||
ctNumVal.setIdx(i); | |||
ctNumVal.setV(value.toString()); | |||
effectiveNumOfPoints++; | |||
} | |||
} | |||
if (effectiveNumOfPoints == 0) { | |||
cache.unsetPtCount(); | |||
} else { | |||
if (cache.isSetPtCount()) { | |||
cache.getPtCount().setVal(numOfPoints); | |||
} else { | |||
cache.addNewPtCount().setVal(numOfPoints); | |||
} | |||
} | |||
} | |||
} | |||
} |
@@ -20,6 +20,9 @@ | |||
package org.apache.poi.xddf.usermodel.chart; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal; | |||
@Beta | |||
public interface XDDFDataSource<T> { | |||
@@ -46,4 +49,34 @@ public interface XDDFDataSource<T> { | |||
String getDataRangeReference(); | |||
String getFormula(); | |||
/** | |||
* @since POI 4.1.2 | |||
*/ | |||
@Internal | |||
default void fillStringCache(CTStrData cache) { | |||
cache.setPtArray(null); // unset old values | |||
final int numOfPoints = getPointCount(); | |||
int effectiveNumOfPoints = 0; | |||
for (int i = 0; i < numOfPoints; ++i) { | |||
Object value = getPointAt(i); | |||
if (value != null) { | |||
CTStrVal ctStrVal = cache.addNewPt(); | |||
ctStrVal.setIdx(i); | |||
ctStrVal.setV(value.toString()); | |||
effectiveNumOfPoints++; | |||
} | |||
} | |||
if (effectiveNumOfPoints == 0) { | |||
if (cache.isSetPtCount()) { | |||
cache.unsetPtCount(); | |||
} | |||
} else { | |||
if (cache.isSetPtCount()) { | |||
cache.getPtCount().setVal(numOfPoints); | |||
} else { | |||
cache.addNewPtCount().setVal(numOfPoints); | |||
} | |||
} | |||
} | |||
} |
@@ -22,6 +22,9 @@ import org.apache.poi.util.Internal; | |||
import org.apache.poi.xddf.usermodel.XDDFShapeProperties; | |||
import org.apache.xmlbeans.XmlObject; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTErrBars; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef; | |||
/** | |||
* @since POI 4.1.2 | |||
@@ -166,5 +169,61 @@ public class XDDFErrorBars { | |||
} | |||
} | |||
// TODO handle minus and plus as numerical data sources | |||
public XDDFNumericalDataSource<Double> getMinus() { | |||
if (bars.isSetMinus()) { | |||
return XDDFDataSourcesFactory.fromDataSource(bars.getMinus()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setMinus(XDDFNumericalDataSource<Double> ds) { | |||
if (ds == null) { | |||
if (bars.isSetMinus()) { | |||
bars.unsetMinus(); | |||
} | |||
} else { | |||
if (bars.isSetMinus()) { | |||
ds.fillNumericalCache(retrieveCache(bars.getMinus(), ds.getDataRangeReference())); | |||
} else { | |||
CTNumDataSource ctDS = bars.addNewMinus(); | |||
ctDS.addNewNumLit(); | |||
ds.fillNumericalCache(retrieveCache(ctDS, ds.getDataRangeReference())); | |||
} | |||
} | |||
} | |||
public XDDFNumericalDataSource<Double> getPlus() { | |||
if (bars.isSetPlus()) { | |||
return XDDFDataSourcesFactory.fromDataSource(bars.getPlus()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setPlus(XDDFNumericalDataSource<Double> ds) { | |||
if (ds == null) { | |||
if (bars.isSetPlus()) { | |||
bars.unsetPlus(); | |||
} | |||
} else { | |||
if (bars.isSetPlus()) { | |||
ds.fillNumericalCache(retrieveCache(bars.getPlus(), ds.getDataRangeReference())); | |||
} else { | |||
CTNumDataSource ctDS = bars.addNewPlus(); | |||
ctDS.addNewNumLit(); | |||
ds.fillNumericalCache(retrieveCache(ctDS, ds.getDataRangeReference())); | |||
} | |||
} | |||
} | |||
private CTNumData retrieveCache(CTNumDataSource ds, String dataRangeReference) { | |||
if (ds.isSetNumRef()) { | |||
CTNumRef numRef = ds.getNumRef(); | |||
numRef.setF(dataRangeReference); | |||
return numRef.getNumCache(); | |||
} else { | |||
return ds.getNumLit(); | |||
} | |||
} | |||
} |
@@ -20,6 +20,9 @@ | |||
package org.apache.poi.xddf.usermodel.chart; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal; | |||
@Beta | |||
public interface XDDFNumericalDataSource<T extends Number> extends XDDFDataSource<T> { | |||
@@ -31,4 +34,40 @@ public interface XDDFNumericalDataSource<T extends Number> extends XDDFDataSourc | |||
default boolean isLiteral() { | |||
return false; | |||
} | |||
/** | |||
* @since POI 4.1.2 | |||
*/ | |||
@Internal | |||
default void fillNumericalCache(CTNumData cache) { | |||
String formatCode = getFormatCode(); | |||
if (formatCode == null) { | |||
if (cache.isSetFormatCode()) { | |||
cache.unsetFormatCode(); | |||
} | |||
} else { | |||
cache.setFormatCode(formatCode); | |||
} | |||
cache.setPtArray(null); // unset old values | |||
final int numOfPoints = getPointCount(); | |||
int effectiveNumOfPoints = 0; | |||
for (int i = 0; i < numOfPoints; ++i) { | |||
Object value = getPointAt(i); | |||
if (value != null) { | |||
CTNumVal ctNumVal = cache.addNewPt(); | |||
ctNumVal.setIdx(i); | |||
ctNumVal.setV(value.toString()); | |||
effectiveNumOfPoints++; | |||
} | |||
} | |||
if (effectiveNumOfPoints == 0) { | |||
cache.unsetPtCount(); | |||
} else { | |||
if (cache.isSetPtCount()) { | |||
cache.getPtCount().setVal(numOfPoints); | |||
} else { | |||
cache.addNewPtCount().setVal(numOfPoints); | |||
} | |||
} | |||
} | |||
} |