From 9973fecad03c8155833f076c8d4139d6a2925e23 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alain=20B=C3=A9arez?= Date: Wed, 26 Sep 2018 00:30:33 +0000 Subject: [PATCH] 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 --- .../poi/xslf/usermodel/BarChartDemo.java | 3 ++ .../poi/xssf/usermodel/examples/BarChart.java | 29 +++++++++++----- ...tExampleDOCX.java => BarChartExample.java} | 7 ++-- .../usermodel/chart/XDDFBarChartData.java | 15 ++++++++ .../poi/xddf/usermodel/chart/XDDFChart.java | 30 +++++++++++++++- .../usermodel/chart/XDDFLineChartData.java | 12 +++++++ .../usermodel/chart/XDDFRadarChartData.java | 12 +++++++ .../usermodel/chart/XDDFScatterChartData.java | 34 +++++++++++++++++++ 8 files changed, 131 insertions(+), 11 deletions(-) rename src/examples/src/org/apache/poi/xwpf/usermodel/examples/{BarChartExampleDOCX.java => BarChartExample.java} (95%) diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/BarChartDemo.java b/src/examples/src/org/apache/poi/xslf/usermodel/BarChartDemo.java index 3b45f166c2..ac1d68a7df 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/BarChartDemo.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/BarChartDemo.java @@ -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); diff --git a/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarChart.java b/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarChart.java index e05599f9fb..d9090d7dd1 100644 --- a/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarChart.java +++ b/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarChart.java @@ -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); + } } diff --git a/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExampleDOCX.java b/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java similarity index 95% rename from src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExampleDOCX.java rename to src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java index a2fa59cda0..12a271811b 100644 --- a/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExampleDOCX.java +++ b/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java @@ -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 "); + System.out.println("Usage: BarChartExample "); 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); diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java index a696a3b8f4..5e89e775fa 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java @@ -34,9 +34,24 @@ public class XDDFBarChartData extends XDDFChartData { public XDDFBarChartData(CTBarChart chart, Map categories, Map 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 categories, Map 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); } diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java index f23ce6d23a..5b43eeb292 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java @@ -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 getCategoryAxes() { CTPlotArea plotArea = getCTPlotArea(); int sizeOfArray = plotArea.sizeOfCatAxArray(); - Map axes = new HashMap(sizeOfArray); + Map axes = new HashMap<>(sizeOfArray); for (int i = 0; i < sizeOfArray; i++) { CTCatAx category = plotArea.getCatAxArray(i); axes.put(category.getAxId().getVal(), new XDDFCategoryAxis(category)); diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLineChartData.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLineChartData.java index 03ee375e93..687bc44abe 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLineChartData.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLineChartData.java @@ -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 categories, Map 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); } diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFRadarChartData.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFRadarChartData.java index a189391346..ce1cd59656 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFRadarChartData.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFRadarChartData.java @@ -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 categories, Map 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); } diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFScatterChartData.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFScatterChartData.java index bd6c69b21c..22f7eea396 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFScatterChartData.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFScatterChartData.java @@ -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 categories, Map 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()) { -- 2.39.5