adapting some contributions by Axel Richter on SO

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1841988 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Alain Béarez 2018-09-26 00:30:33 +00:00
parent 6af2173f93
commit e159d4e179
8 changed files with 131 additions and 11 deletions

View File

@ -115,6 +115,9 @@ public class BarChartDemo {
// in order to transform a bar chart into a column chart, you just need to change the bar direction
bar.setBarDirection(BarDirection.COL);
// looking for "Stacked Bar Chart"? uncomment the following line
// bar.setBarGrouping(BarGrouping.STACKED);
// additionally, you can adjust the axes
bar.getCategoryAxis().setOrientation(AxisOrientation.MAX_MIN);
bar.getValueAxes().get(0).setPosition(AxisPosition.TOP);

View File

@ -28,8 +28,10 @@ import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.BarDirection;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
@ -86,14 +88,14 @@ public class BarChart {
data.addSeries(xs, ys2);
chart.plot(data);
XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.CHARTREUSE));
XDDFChartData.Series firstSeries = data.getSeries().get(0);
XDDFShapeProperties properties = firstSeries.getShapeProperties();
if (properties == null) {
properties = new XDDFShapeProperties();
}
properties.setFillProperties(fill);
firstSeries.setShapeProperties(properties);
// in order to transform a bar chart into a column chart, you just need to change the bar direction
XDDFBarChartData bar = (XDDFBarChartData) data;
bar.setBarDirection(BarDirection.COL);
// looking for "Stacked Bar Chart"? uncomment the following line
// bar.setBarGrouping(BarGrouping.STACKED);
solidFillSeries(data, 0, PresetColor.CHARTREUSE);
solidFillSeries(data, 1, PresetColor.TURQUOISE);
// Write the output to a file
try (FileOutputStream fileOut = new FileOutputStream("ooxml-bar-chart.xlsx")) {
@ -101,4 +103,15 @@ public class BarChart {
}
}
}
private static void solidFillSeries(XDDFChartData data, int index, PresetColor color) {
XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(color));
XDDFChartData.Series firstSeries = data.getSeries().get(index);
XDDFShapeProperties properties = firstSeries.getShapeProperties();
if (properties == null) {
properties = new XDDFShapeProperties();
}
properties.setFillProperties(fill);
firstSeries.setShapeProperties(properties);
}
}

View File

@ -43,9 +43,9 @@ import org.apache.poi.xwpf.usermodel.XWPFDocument;
/**
* Build a bar chart from a template docx
*/
public class BarChartExampleDOCX {
public class BarChartExample {
private static void usage(){
System.out.println("Usage: BarChartDemo <bar-chart-template.docx> <bar-chart-data.txt>");
System.out.println("Usage: BarChartExample <bar-chart-template.docx> <bar-chart-data.txt>");
System.out.println(" bar-chart-template.docx template with a bar chart");
System.out.println(" bar-chart-data.txt the model to set. First line is chart title, " +
"then go pairs {axis-label value}");
@ -119,6 +119,9 @@ public class BarChartExampleDOCX {
// in order to transform a bar chart into a column chart, you just need to change the bar direction
bar.setBarDirection(BarDirection.COL);
// looking for "Stacked Bar Chart"? uncomment the following line
// bar.setBarGrouping(BarGrouping.STACKED);
// additionally, you can adjust the axes
bar.getCategoryAxis().setOrientation(AxisOrientation.MAX_MIN);

View File

@ -34,9 +34,24 @@ public class XDDFBarChartData extends XDDFChartData {
public XDDFBarChartData(CTBarChart chart, Map<Long, XDDFChartAxis> categories,
Map<Long, XDDFValueAxis> values) {
this.chart = chart;
if (chart.getBarDir() == null) {
chart.addNewBarDir().setVal(BarDirection.BAR.underlying);
}
for (CTBarSer series : chart.getSerList()) {
this.series.add(new Series(series, series.getCat(), series.getVal()));
}
defineAxes(categories, values);
}
private void defineAxes(Map<Long, XDDFChartAxis> categories, Map<Long, XDDFValueAxis> values) {
if (chart.sizeOfAxIdArray() == 0) {
for (Long id : categories.keySet()) {
chart.addNewAxId().setVal(id);
}
for (Long id : values.keySet()) {
chart.addNewAxId().setVal(id);
}
}
defineAxes(chart.getAxIdArray(), categories, values);
}

View File

@ -214,6 +214,34 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai
chart.getAutoTitleDeleted().setVal(deleted);
}
/**
* @since 4.0.1
*/
public Boolean getTitleOverlay() {
if (chart.isSetTitle()) {
CTTitle title = chart.getTitle();
if (title.isSetOverlay()) {
return title.getOverlay().getVal();
}
}
return null;
}
/**
* @since 4.0.1
*/
public void setTitleOverlay(boolean overlay) {
if (!chart.isSetTitle()) {
chart.addNewTitle();
}
CTTitle title = chart.getTitle();
if (title.isSetOverlay()) {
title.getOverlay().setVal(overlay);
} else {
title.addNewOverlay().setVal(overlay);
}
}
/**
* Get the chart title body if there is one, i.e. title is set and is not a
* formula.
@ -327,7 +355,7 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai
private Map<Long, XDDFChartAxis> getCategoryAxes() {
CTPlotArea plotArea = getCTPlotArea();
int sizeOfArray = plotArea.sizeOfCatAxArray();
Map<Long, XDDFChartAxis> axes = new HashMap<Long, XDDFChartAxis>(sizeOfArray);
Map<Long, XDDFChartAxis> axes = new HashMap<>(sizeOfArray);
for (int i = 0; i < sizeOfArray; i++) {
CTCatAx category = plotArea.getCatAxArray(i);
axes.put(category.getAxId().getVal(), new XDDFCategoryAxis(category));

View File

@ -38,6 +38,18 @@ public class XDDFLineChartData extends XDDFChartData {
for (CTLineSer series : chart.getSerList()) {
this.series.add(new Series(series, series.getCat(), series.getVal()));
}
defineAxes(categories, values);
}
private void defineAxes(Map<Long, XDDFChartAxis> categories, Map<Long, XDDFValueAxis> values) {
if (chart.sizeOfAxIdArray() == 0) {
for (Long id : categories.keySet()) {
chart.addNewAxId().setVal(id);
}
for (Long id : values.keySet()) {
chart.addNewAxId().setVal(id);
}
}
defineAxes(chart.getAxIdArray(), categories, values);
}

View File

@ -38,6 +38,18 @@ public class XDDFRadarChartData extends XDDFChartData {
for (CTRadarSer series : chart.getSerList()) {
this.series.add(new Series(series, series.getCat(), series.getVal()));
}
defineAxes(categories, values);
}
private void defineAxes(Map<Long, XDDFChartAxis> categories, Map<Long, XDDFValueAxis> values) {
if (chart.sizeOfAxIdArray() == 0) {
for (Long id : categories.keySet()) {
chart.addNewAxId().setVal(id);
}
for (Long id : values.keySet()) {
chart.addNewAxId().setVal(id);
}
}
defineAxes(chart.getAxIdArray(), categories, values);
}

View File

@ -38,6 +38,18 @@ public class XDDFScatterChartData extends XDDFChartData {
for (CTScatterSer series : chart.getSerList()) {
this.series.add(new Series(series, series.getXVal(), series.getYVal()));
}
defineAxes(categories, values);
}
private void defineAxes(Map<Long, XDDFChartAxis> categories, Map<Long, XDDFValueAxis> values) {
if (chart.sizeOfAxIdArray() == 0) {
for (Long id : categories.keySet()) {
chart.addNewAxId().setVal(id);
}
for (Long id : values.keySet()) {
chart.addNewAxId().setVal(id);
}
}
defineAxes(chart.getAxIdArray(), categories, values);
}
@ -99,6 +111,28 @@ public class XDDFScatterChartData extends XDDFChartData {
return series.getTx();
}
/**
* @since 4.0.1
*/
public Boolean getSmooth() {
if (series.isSetSmooth()) {
return series.getSmooth().getVal();
} else {
return null;
}
}
/**
* @since 4.0.1
*/
public void setSmooth(boolean smooth) {
if (series.isSetSmooth()) {
series.getSmooth().setVal(smooth);
} else {
series.addNewSmooth().setVal(smooth);
}
}
@Override
public void setShowLeaderLines(boolean showLeaderLines) {
if (!series.isSetDLbls()) {