example from StackOverflow question 47065690
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1842925 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
01b780666b
commit
c66af5c21e
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -82,6 +82,19 @@ public class XDDFDateAxis extends XDDFChartAxis {
|
|||||||
return new XDDFShapeProperties(properties);
|
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
|
@Override
|
||||||
public boolean isSetMinorUnit() {
|
public boolean isSetMinorUnit() {
|
||||||
return ctDateAx.isSetMinorUnit();
|
return ctDateAx.isSetMinorUnit();
|
||||||
|
@ -79,6 +79,19 @@ public class XDDFSeriesAxis extends XDDFChartAxis {
|
|||||||
return new XDDFShapeProperties(properties);
|
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
|
@Override
|
||||||
public boolean isSetMinorUnit() {
|
public boolean isSetMinorUnit() {
|
||||||
return false;
|
return false;
|
||||||
|
@ -69,7 +69,7 @@ public final class XSLFChart extends XDDFChart {
|
|||||||
return XSLFFactory.getInstance();
|
return XSLFFactory.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSLFTextShape getTitle() {
|
public XSLFTextShape getTitleShape() {
|
||||||
if (!chart.isSetTitle()) {
|
if (!chart.isSetTitle()) {
|
||||||
chart.addNewTitle();
|
chart.addNewTitle();
|
||||||
}
|
}
|
||||||
|
@ -260,19 +260,6 @@ public final class XSSFChart extends XDDFChart implements Chart, ChartAxisFactor
|
|||||||
return new XSSFManualLayout(this);
|
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
|
* 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
|
* 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
|
* @param newTitle
|
||||||
* to use
|
* to use
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void setTitleText(String newTitle) {
|
public void setTitleText(String newTitle) {
|
||||||
CTTitle ctTitle;
|
CTTitle ctTitle;
|
||||||
if (chart.isSetTitle()) {
|
if (chart.isSetTitle()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user