From c66af5c21e63922b8f81ec29793e1085ea03a057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alain=20B=C3=A9arez?= Date: Fri, 5 Oct 2018 14:36:18 +0000 Subject: [PATCH] example from StackOverflow question 47065690 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1842925 13f79535-47bb-0310-9956-ffa450edef68 --- .../usermodel/examples/BarAndLineChart.java | 164 ++++++++++++++++++ .../xddf/usermodel/chart/XDDFDateAxis.java | 13 ++ .../xddf/usermodel/chart/XDDFSeriesAxis.java | 13 ++ .../apache/poi/xslf/usermodel/XSLFChart.java | 2 +- .../apache/poi/xssf/usermodel/XSSFChart.java | 14 +- 5 files changed, 192 insertions(+), 14 deletions(-) create mode 100644 src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java diff --git a/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java b/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java new file mode 100644 index 000000000..13d4ff654 --- /dev/null +++ b/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java @@ -0,0 +1,164 @@ +/* + * ==================================================================== + * 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.xssf.usermodel.examples; + +import java.io.FileOutputStream; +import java.util.Random; + +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellReference; +import org.apache.poi.xddf.usermodel.PresetColor; +import org.apache.poi.xddf.usermodel.XDDFColor; +import org.apache.poi.xddf.usermodel.XDDFLineProperties; +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.XDDFCategoryDataSource; +import org.apache.poi.xddf.usermodel.chart.XDDFChartData; +import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend; +import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory; +import org.apache.poi.xddf.usermodel.chart.XDDFLineChartData; +import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource; +import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFChart; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFDrawing; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +public class BarAndLineChart { + private static final int NUM_OF_ROWS = 7; + private static final Random RNG = new Random(); + + public static void main(String[] args) throws Exception { + try (XSSFWorkbook wb = new XSSFWorkbook()) { + XSSFSheet sheet = wb.createSheet("Sheet1"); + + XSSFRow row = sheet.createRow(0); + row.createCell(0); + row.createCell(1).setCellValue("Bars"); + row.createCell(2).setCellValue("Lines"); + + XSSFCell cell; + for (int r = 1; r < NUM_OF_ROWS; r++) { + row = sheet.createRow(r); + cell = row.createCell(0); + cell.setCellValue("C" + r); + cell = row.createCell(1); + cell.setCellValue(RNG.nextDouble()); + cell = row.createCell(2); + cell.setCellValue(RNG.nextDouble() * 10); + } + + XSSFDrawing drawing = sheet.createDrawingPatriarch(); + XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 4, 0, 11, 15); + + XSSFChart chart = drawing.createChart(anchor); + + // the data sources + XDDFCategoryDataSource xs = XDDFDataSourcesFactory.fromStringCellRange(sheet, + new CellRangeAddress(1, NUM_OF_ROWS - 1, 0, 0)); + XDDFNumericalDataSource ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, + new CellRangeAddress(1, NUM_OF_ROWS - 1, 1, 1)); + XDDFNumericalDataSource ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, + new CellRangeAddress(1, NUM_OF_ROWS - 1, 2, 2)); + + // cat axis 1 (bars) + XDDFCategoryAxis barCategories = chart.createCategoryAxis(AxisPosition.BOTTOM); + + // val axis 1 (left) + XDDFValueAxis leftValues = chart.createValueAxis(AxisPosition.LEFT); + leftValues.crossAxis(barCategories); + barCategories.crossAxis(leftValues); + + // cat axis 2 (lines) + XDDFCategoryAxis lineCategories = chart.createCategoryAxis(AxisPosition.BOTTOM); + lineCategories.setVisible(false); // this cat axis is deleted + + // val axis 2 (right) + XDDFValueAxis rightValues = chart.createValueAxis(AxisPosition.RIGHT); + // this value axis crosses its category axis at max value + rightValues.setCrosses(AxisCrosses.MAX); + rightValues.crossAxis(lineCategories); + lineCategories.crossAxis(rightValues); + + // the bar chart + XDDFBarChartData bar = (XDDFBarChartData) chart.createData(ChartTypes.BAR, lineCategories, rightValues); + XDDFBarChartData.Series series1 = (XDDFBarChartData.Series) bar.addSeries(xs, ys1); + series1.setTitle("Bars", new CellReference("Sheet1!$B$1")); + bar.setVaryColors(true); + bar.setBarDirection(BarDirection.COL); + chart.plot(bar); + + // the line chart + XDDFLineChartData lines = (XDDFLineChartData) chart.createData(ChartTypes.LINE, lineCategories, + rightValues); + XDDFLineChartData.Series series2 = (XDDFLineChartData.Series) lines.addSeries(xs, ys2); + series2.setTitle("Lines", new CellReference("Sheet1!$C$1")); + lines.setVaryColors(true); + chart.plot(lines); + + // some colors + solidFillSeries(bar, 0, PresetColor.CHARTREUSE); + solidLineSeries(lines, 0, PresetColor.TURQUOISE); + + // legend + XDDFChartLegend legend = chart.getOrAddLegend(); + legend.setPosition(LegendPosition.BOTTOM); + legend.setOverlay(false); + + try (FileOutputStream fileOut = new FileOutputStream("BarAndLineChart.xlsx")) { + wb.write(fileOut); + } + } + } + + private static void solidFillSeries(XDDFChartData data, int index, PresetColor color) { + XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(color)); + XDDFChartData.Series series = data.getSeries().get(index); + XDDFShapeProperties properties = series.getShapeProperties(); + if (properties == null) { + properties = new XDDFShapeProperties(); + } + properties.setFillProperties(fill); + series.setShapeProperties(properties); + } + + private static void solidLineSeries(XDDFChartData data, int index, PresetColor color) { + XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(color)); + XDDFLineProperties line = new XDDFLineProperties(); + line.setFillProperties(fill); + XDDFChartData.Series series = data.getSeries().get(index); + XDDFShapeProperties properties = series.getShapeProperties(); + if (properties == null) { + properties = new XDDFShapeProperties(); + } + properties.setLineProperties(line); + series.setShapeProperties(properties); + } +} diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDateAxis.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDateAxis.java index bde26ffb7..b0a1e1031 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDateAxis.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDateAxis.java @@ -82,6 +82,19 @@ public class XDDFDateAxis extends XDDFChartAxis { return new XDDFShapeProperties(properties); } + /** + * @since 4.0.1 + */ + @Override + public void setTitle(String text) { + if (!ctDateAx.isSetTitle()) { + ctDateAx.addNewTitle(); + } + XDDFTitle title = new XDDFTitle(null, ctDateAx.getTitle()); + title.setOverlay(false); + title.setText(text); + } + @Override public boolean isSetMinorUnit() { return ctDateAx.isSetMinorUnit(); diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSeriesAxis.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSeriesAxis.java index 37ec0ddab..5e555335b 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSeriesAxis.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSeriesAxis.java @@ -79,6 +79,19 @@ public class XDDFSeriesAxis extends XDDFChartAxis { return new XDDFShapeProperties(properties); } + /** + * @since 4.0.1 + */ + @Override + public void setTitle(String text) { + if (!ctSerAx.isSetTitle()) { + ctSerAx.addNewTitle(); + } + XDDFTitle title = new XDDFTitle(null, ctSerAx.getTitle()); + title.setOverlay(false); + title.setText(text); + } + @Override public boolean isSetMinorUnit() { return false; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFChart.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFChart.java index d2ce33878..8e6612f87 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFChart.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFChart.java @@ -69,7 +69,7 @@ public final class XSLFChart extends XDDFChart { return XSLFFactory.getInstance(); } - public XSLFTextShape getTitle() { + public XSLFTextShape getTitleShape() { if (!chart.isSetTitle()) { chart.addNewTitle(); } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java index dc1ef9f2e..d7971839f 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java @@ -260,19 +260,6 @@ public final class XSSFChart extends XDDFChart implements Chart, ChartAxisFactor return new XSSFManualLayout(this); } - /** - * Returns the title static text, or null if none is set. Note that a title - * formula may be set instead. - * - * @return static title text, if set - * @deprecated POI 3.16, use {@link #getTitleText()} instead. - */ - @Deprecated - @Removal(version = "4.0") - public XSSFRichTextString getTitle() { - return getTitleText(); - } - /** * Returns the title static text, or null if none is set. Note that a title * formula may be set instead. Empty text result is for backward @@ -313,6 +300,7 @@ public final class XSSFChart extends XDDFChart implements Chart, ChartAxisFactor * @param newTitle * to use */ + @Override public void setTitleText(String newTitle) { CTTitle ctTitle; if (chart.isSetTitle()) {