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:
parent
6af2173f93
commit
e159d4e179
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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}");
|
||||
@ -120,6 +120,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);
|
||||
bar.getValueAxes().get(0).setPosition(AxisPosition.TOP);
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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()) {
|
||||
|
Loading…
Reference in New Issue
Block a user