mirror of https://github.com/apache/poi.git
Allow for numerical category in charts
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1874705 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
2522a3bc89
commit
850387f5cb
|
@ -211,7 +211,7 @@ public abstract class XDDFChartData {
|
|||
public void plot() {
|
||||
if (categoryData.isNumeric()) {
|
||||
CTNumData cache = retrieveNumCache(getAxDS(), categoryData);
|
||||
((XDDFNumericalDataSource<?>) categoryData).fillNumericalCache(cache);
|
||||
categoryData.fillNumericalCache(cache);
|
||||
} else {
|
||||
CTStrData cache = retrieveStrCache(getAxDS(), categoryData);
|
||||
categoryData.fillStringCache(cache);
|
||||
|
|
|
@ -21,6 +21,8 @@ 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;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrVal;
|
||||
|
||||
|
@ -50,6 +52,44 @@ public interface XDDFDataSource<T> {
|
|||
|
||||
String getFormula();
|
||||
|
||||
String getFormatCode();
|
||||
|
||||
/**
|
||||
* @since POI 4.1.3
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @since POI 4.1.2
|
||||
*/
|
||||
|
|
|
@ -45,6 +45,7 @@ public class XDDFDataSourcesFactory {
|
|||
if (categoryDS.getStrRef() == null) {
|
||||
return new XDDFCategoryDataSource() {
|
||||
private CTNumData category = (CTNumData) categoryDS.getNumRef().getNumCache().copy();
|
||||
private String formatCode = category.isSetFormatCode() ? category.getFormatCode() : null;
|
||||
|
||||
@Override
|
||||
public boolean isCellRange() {
|
||||
|
@ -70,6 +71,9 @@ public class XDDFDataSourcesFactory {
|
|||
public String getPointAt(int index) {
|
||||
return category.getPtArray(index).getV();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormatCode() { return formatCode; }
|
||||
};
|
||||
} else {
|
||||
return new XDDFCategoryDataSource() {
|
||||
|
@ -94,6 +98,9 @@ public class XDDFDataSourcesFactory {
|
|||
public String getPointAt(int index) {
|
||||
return category.getPtArray(index).getV();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormatCode() { return null; }
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -287,6 +294,9 @@ public class XDDFDataSourcesFactory {
|
|||
public String getFormula() {
|
||||
return getDataRangeReference();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormatCode() { return null; }
|
||||
}
|
||||
|
||||
private static class LiteralNumericalArrayDataSource<T extends Number> extends NumericalArrayDataSource<T> {
|
||||
|
@ -430,5 +440,8 @@ public class XDDFDataSourcesFactory {
|
|||
public boolean isNumeric() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFormatCode() { return null; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,48 +26,10 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumVal;
|
|||
|
||||
@Beta
|
||||
public interface XDDFNumericalDataSource<T extends Number> extends XDDFDataSource<T> {
|
||||
String getFormatCode();
|
||||
|
||||
void setFormatCode(String formatCode);
|
||||
|
||||
@Override
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue