// 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);
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;
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")) {
}
}
}
+
+ 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);
+ }
}
--- /dev/null
+
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.xwpf.usermodel.examples;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xddf.usermodel.chart.AxisOrientation;
+import org.apache.poi.xddf.usermodel.chart.AxisPosition;
+import org.apache.poi.xddf.usermodel.chart.BarDirection;
+import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
+import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
+import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
+import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
+import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
+import org.apache.poi.xwpf.usermodel.XWPFChart;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+
+/**
+ * Build a bar chart from a template docx
+ */
+public class BarChartExample {
+ private static void usage(){
+ 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}");
+ }
+
+ public static void main(String[] args) throws Exception {
+ if(args.length < 2) {
+ usage();
+ return;
+ }
+
+ try (FileInputStream argIS = new FileInputStream(args[0]);
+ BufferedReader modelReader = new BufferedReader(new FileReader(args[1]))) {
+
+ String chartTitle = modelReader.readLine(); // first line is chart title
+
+ // Category Axis Data
+ List<String> listCategories = new ArrayList<String>(3);
+
+ // Values
+ List<Double> listValues = new ArrayList<Double>(3);
+
+ // set model
+ String ln;
+ while((ln = modelReader.readLine()) != null) {
+ String[] vals = ln.split("\\s+");
+ listCategories.add(vals[0]);
+ listValues.add(Double.valueOf(vals[1]));
+ }
+ String[] categories = listCategories.toArray(new String[listCategories.size()]);
+ Double[] values = listValues.toArray(new Double[listValues.size()]);
+
+ try (XWPFDocument doc = new XWPFDocument(argIS)) {
+ XWPFChart chart = doc.getCharts().get(0);
+ setBarData(chart, chartTitle, categories, values);
+ chart = doc.getCharts().get(1);
+ setColumnData(chart, "Column variant");
+
+ // save the result
+ try (OutputStream out = new FileOutputStream("bar-chart-demo-output.docx")) {
+ doc.write(out);
+ }
+ }
+ }
+ System.out.println("Done");
+ }
+
+ private static void setBarData(XWPFChart chart, String chartTitle, String[] categories, Double[] values) {
+ final List<XDDFChartData> series = chart.getChartSeries();
+ final XDDFBarChartData bar = (XDDFBarChartData) series.get(0);
+
+ final int numOfPoints = categories.length;
+ final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
+ final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
+ final String valuesDataRange2 = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2));
+ final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);
+ final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange, 1);
+ values[2] = 10.0;
+ final XDDFNumericalDataSource<? extends Number> valuesData2 = XDDFDataSourcesFactory.fromArray(values, valuesDataRange2, 2);
+ bar.getSeries().get(0).replaceData(categoriesData, valuesData);
+ bar.addSeries(categoriesData, valuesData2);
+ bar.getSeries().get(0).setTitle(chartTitle, chart.setSheetTitle(chartTitle));
+ chart.plot(bar);
+ }
+
+ private static void setColumnData(XWPFChart chart, String chartTitle) {
+ // Series Text
+ List<XDDFChartData> series = chart.getChartSeries();
+ XDDFBarChartData bar = (XDDFBarChartData) series.get(0);
+ bar.getSeries().get(0).setTitle(chartTitle, chart.setSheetTitle(chartTitle));
+
+ // 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);
+ }
+}
+
+++ /dev/null
-
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ====================================================================
- */
-
-package org.apache.poi.xwpf.usermodel.examples;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.xddf.usermodel.chart.AxisOrientation;
-import org.apache.poi.xddf.usermodel.chart.AxisPosition;
-import org.apache.poi.xddf.usermodel.chart.BarDirection;
-import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
-import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
-import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
-import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
-import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
-import org.apache.poi.xwpf.usermodel.XWPFChart;
-import org.apache.poi.xwpf.usermodel.XWPFDocument;
-
-/**
- * Build a bar chart from a template docx
- */
-public class BarChartExampleDOCX {
- private static void usage(){
- System.out.println("Usage: BarChartDemo <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}");
- }
-
- public static void main(String[] args) throws Exception {
- if(args.length < 2) {
- usage();
- return;
- }
-
- try (FileInputStream argIS = new FileInputStream(args[0]);
- BufferedReader modelReader = new BufferedReader(new FileReader(args[1]))) {
-
- String chartTitle = modelReader.readLine(); // first line is chart title
-
- // Category Axis Data
- List<String> listCategories = new ArrayList<String>(3);
-
- // Values
- List<Double> listValues = new ArrayList<Double>(3);
-
- // set model
- String ln;
- while((ln = modelReader.readLine()) != null) {
- String[] vals = ln.split("\\s+");
- listCategories.add(vals[0]);
- listValues.add(Double.valueOf(vals[1]));
- }
- String[] categories = listCategories.toArray(new String[listCategories.size()]);
- Double[] values = listValues.toArray(new Double[listValues.size()]);
-
- try (XWPFDocument doc = new XWPFDocument(argIS)) {
- XWPFChart chart = doc.getCharts().get(0);
- setBarData(chart, chartTitle, categories, values);
- chart = doc.getCharts().get(1);
- setColumnData(chart, "Column variant");
-
- // save the result
- try (OutputStream out = new FileOutputStream("bar-chart-demo-output.docx")) {
- doc.write(out);
- }
- }
- }
- System.out.println("Done");
- }
-
- private static void setBarData(XWPFChart chart, String chartTitle, String[] categories, Double[] values) {
- final List<XDDFChartData> series = chart.getChartSeries();
- final XDDFBarChartData bar = (XDDFBarChartData) series.get(0);
-
- final int numOfPoints = categories.length;
- final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
- final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
- final String valuesDataRange2 = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2));
- final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);
- final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values, valuesDataRange, 1);
- values[2] = 10.0;
- final XDDFNumericalDataSource<? extends Number> valuesData2 = XDDFDataSourcesFactory.fromArray(values, valuesDataRange2, 2);
- bar.getSeries().get(0).replaceData(categoriesData, valuesData);
- bar.addSeries(categoriesData, valuesData2);
- bar.getSeries().get(0).setTitle(chartTitle, chart.setSheetTitle(chartTitle));
- chart.plot(bar);
- }
-
- private static void setColumnData(XWPFChart chart, String chartTitle) {
- // Series Text
- List<XDDFChartData> series = chart.getChartSeries();
- XDDFBarChartData bar = (XDDFBarChartData) series.get(0);
- bar.getSeries().get(0).setTitle(chartTitle, chart.setSheetTitle(chartTitle));
-
- // in order to transform a bar chart into a column chart, you just need to change the bar direction
- bar.setBarDirection(BarDirection.COL);
-
- // additionally, you can adjust the axes
- bar.getCategoryAxis().setOrientation(AxisOrientation.MAX_MIN);
- bar.getValueAxes().get(0).setPosition(AxisPosition.TOP);
- }
-}
-
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);
}
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.
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));
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);
}
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);
}
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);
}
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()) {