diff options
author | Alain Béarez <abearez@apache.org> | 2018-10-05 14:36:18 +0000 |
---|---|---|
committer | Alain Béarez <abearez@apache.org> | 2018-10-05 14:36:18 +0000 |
commit | cffa31ed62836e89e3cc392190850fc6cfb71015 (patch) | |
tree | 65b3b57e50b709e6ae22a4875c9a7644b72e27be /src/examples | |
parent | f446df6f6647e765970e5074b8429856cf5cbffe (diff) | |
download | poi-cffa31ed62836e89e3cc392190850fc6cfb71015.tar.gz poi-cffa31ed62836e89e3cc392190850fc6cfb71015.zip |
example from StackOverflow question 47065690
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1842925 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/examples')
-rw-r--r-- | src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java | 164 |
1 files changed, 164 insertions, 0 deletions
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 0000000000..13d4ff654c --- /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<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, + new CellRangeAddress(1, NUM_OF_ROWS - 1, 1, 1)); + XDDFNumericalDataSource<Double> 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); + } +} |