adding tricks from other answers on StackOverflow
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1842959 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c66af5c21e
commit
b326a5cd01
@ -22,6 +22,7 @@ package org.apache.poi.xssf.usermodel.examples;
|
|||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import org.apache.poi.common.usermodel.fonts.FontGroup;
|
||||||
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
import org.apache.poi.ss.util.CellReference;
|
import org.apache.poi.ss.util.CellReference;
|
||||||
import org.apache.poi.xddf.usermodel.PresetColor;
|
import org.apache.poi.xddf.usermodel.PresetColor;
|
||||||
@ -33,6 +34,7 @@ import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
|
|||||||
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
|
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
|
||||||
import org.apache.poi.xddf.usermodel.chart.BarDirection;
|
import org.apache.poi.xddf.usermodel.chart.BarDirection;
|
||||||
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
|
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.LayoutMode;
|
||||||
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
|
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
|
||||||
import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
|
import org.apache.poi.xddf.usermodel.chart.XDDFBarChartData;
|
||||||
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
|
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
|
||||||
@ -41,8 +43,13 @@ import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
|
|||||||
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
|
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
|
||||||
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
|
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
|
||||||
import org.apache.poi.xddf.usermodel.chart.XDDFLineChartData;
|
import org.apache.poi.xddf.usermodel.chart.XDDFLineChartData;
|
||||||
|
import org.apache.poi.xddf.usermodel.chart.XDDFManualLayout;
|
||||||
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
|
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
|
||||||
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
|
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
|
||||||
|
import org.apache.poi.xddf.usermodel.text.UnderlineType;
|
||||||
|
import org.apache.poi.xddf.usermodel.text.XDDFFont;
|
||||||
|
import org.apache.poi.xddf.usermodel.text.XDDFRunProperties;
|
||||||
|
import org.apache.poi.xddf.usermodel.text.XDDFTextParagraph;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFCell;
|
import org.apache.poi.xssf.usermodel.XSSFCell;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFChart;
|
import org.apache.poi.xssf.usermodel.XSSFChart;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
|
||||||
@ -51,6 +58,10 @@ import org.apache.poi.xssf.usermodel.XSSFRow;
|
|||||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
|
// original contributions by Axel Richter on https://stackoverflow.com/questions/47065690
|
||||||
|
// additional title formatting from https://stackoverflow.com/questions/50418856
|
||||||
|
// and legend positioning from https://stackoverflow.com/questions/49615379
|
||||||
|
// this would probably be an answer for https://stackoverflow.com/questions/36447925 too
|
||||||
public class BarAndLineChart {
|
public class BarAndLineChart {
|
||||||
private static final int NUM_OF_ROWS = 7;
|
private static final int NUM_OF_ROWS = 7;
|
||||||
private static final Random RNG = new Random();
|
private static final Random RNG = new Random();
|
||||||
@ -79,6 +90,21 @@ public class BarAndLineChart {
|
|||||||
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 4, 0, 11, 15);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 4, 0, 11, 15);
|
||||||
|
|
||||||
XSSFChart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
|
chart.setTitleText("This is my title");
|
||||||
|
chart.setTitleOverlay(true);
|
||||||
|
XDDFRunProperties properties = new XDDFRunProperties();
|
||||||
|
properties.setBold(true);
|
||||||
|
properties.setItalic(true);
|
||||||
|
properties.setUnderline(UnderlineType.DOT_DOT_DASH_HEAVY);
|
||||||
|
properties.setFontSize(22.5);
|
||||||
|
XDDFFont[] fonts = new XDDFFont[]{
|
||||||
|
new XDDFFont(FontGroup.LATIN, "Calibri", null, null, null),
|
||||||
|
new XDDFFont(FontGroup.COMPLEX_SCRIPT, "Liberation Sans", null, null, null)
|
||||||
|
};
|
||||||
|
properties.setFonts(fonts);
|
||||||
|
properties.setLineProperties(solidLine(PresetColor.SIENNA));
|
||||||
|
XDDFTextParagraph paragraph = chart.getTitle().getBody().getParagraph(0);
|
||||||
|
paragraph.setDefaultRunProperties(properties);
|
||||||
|
|
||||||
// the data sources
|
// the data sources
|
||||||
XDDFCategoryDataSource xs = XDDFDataSourcesFactory.fromStringCellRange(sheet,
|
XDDFCategoryDataSource xs = XDDFDataSourcesFactory.fromStringCellRange(sheet,
|
||||||
@ -129,8 +155,13 @@ public class BarAndLineChart {
|
|||||||
|
|
||||||
// legend
|
// legend
|
||||||
XDDFChartLegend legend = chart.getOrAddLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
legend.setPosition(LegendPosition.BOTTOM);
|
legend.setPosition(LegendPosition.LEFT);
|
||||||
legend.setOverlay(false);
|
legend.setOverlay(false);
|
||||||
|
XDDFManualLayout layout = legend.getOrAddManualLayout();
|
||||||
|
layout.setXMode(LayoutMode.EDGE);
|
||||||
|
layout.setYMode(LayoutMode.EDGE);
|
||||||
|
layout.setX(0.00); //left edge of the chart
|
||||||
|
layout.setY(0.25); //25% of chart's height from top edge of the chart
|
||||||
|
|
||||||
try (FileOutputStream fileOut = new FileOutputStream("BarAndLineChart.xlsx")) {
|
try (FileOutputStream fileOut = new FileOutputStream("BarAndLineChart.xlsx")) {
|
||||||
wb.write(fileOut);
|
wb.write(fileOut);
|
||||||
@ -150,9 +181,7 @@ public class BarAndLineChart {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void solidLineSeries(XDDFChartData data, int index, PresetColor color) {
|
private static void solidLineSeries(XDDFChartData data, int index, PresetColor color) {
|
||||||
XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(color));
|
XDDFLineProperties line = solidLine(color);
|
||||||
XDDFLineProperties line = new XDDFLineProperties();
|
|
||||||
line.setFillProperties(fill);
|
|
||||||
XDDFChartData.Series series = data.getSeries().get(index);
|
XDDFChartData.Series series = data.getSeries().get(index);
|
||||||
XDDFShapeProperties properties = series.getShapeProperties();
|
XDDFShapeProperties properties = series.getShapeProperties();
|
||||||
if (properties == null) {
|
if (properties == null) {
|
||||||
@ -161,4 +190,11 @@ public class BarAndLineChart {
|
|||||||
properties.setLineProperties(line);
|
properties.setLineProperties(line);
|
||||||
series.setShapeProperties(properties);
|
series.setShapeProperties(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static XDDFLineProperties solidLine(PresetColor color) {
|
||||||
|
XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(color));
|
||||||
|
XDDFLineProperties line = new XDDFLineProperties();
|
||||||
|
line.setFillProperties(fill);
|
||||||
|
return line;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,6 +71,8 @@ public class BarChart {
|
|||||||
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
|
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
|
||||||
|
|
||||||
XSSFChart chart = drawing.createChart(anchor);
|
XSSFChart chart = drawing.createChart(anchor);
|
||||||
|
chart.setTitleText("x = 2x and x = 3x");
|
||||||
|
chart.setTitleOverlay(false);
|
||||||
XDDFChartLegend legend = chart.getOrAddLegend();
|
XDDFChartLegend legend = chart.getOrAddLegend();
|
||||||
legend.setPosition(LegendPosition.TOP_RIGHT);
|
legend.setPosition(LegendPosition.TOP_RIGHT);
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ public class BarChartExample {
|
|||||||
|
|
||||||
chart.plot(bar);
|
chart.plot(bar);
|
||||||
chart.setTitleText(chartTitle); // https://stackoverflow.com/questions/30532612
|
chart.setTitleText(chartTitle); // https://stackoverflow.com/questions/30532612
|
||||||
// chart.setTitleOverlay(overlay);
|
chart.setTitleOverlay(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setColumnData(XWPFChart chart, String chartTitle) {
|
private static void setColumnData(XWPFChart chart, String chartTitle) {
|
||||||
|
@ -255,6 +255,10 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Sets the title text as a static string.
|
||||||
|
*
|
||||||
|
* @param text
|
||||||
|
* to use as new title
|
||||||
* @since 4.0.1
|
* @since 4.0.1
|
||||||
*/
|
*/
|
||||||
public void setTitleText(String text) {
|
public void setTitleText(String text) {
|
||||||
|
@ -39,20 +39,17 @@ public class XDDFTitle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public XDDFTextBody getBody() {
|
public XDDFTextBody getBody() {
|
||||||
XDDFTextBody body;
|
if (!title.isSetTx()) {
|
||||||
if (title.isSetTxPr()) {
|
title.addNewTx();
|
||||||
body = new XDDFTextBody(parent, title.getTxPr());
|
|
||||||
} else {
|
|
||||||
if (!title.isSetTx()) {
|
|
||||||
title.addNewTx();
|
|
||||||
}
|
|
||||||
CTTx tx = title.getTx();
|
|
||||||
if (!tx.isSetRich()) {
|
|
||||||
tx.addNewRich();
|
|
||||||
}
|
|
||||||
body = new XDDFTextBody(parent, tx.getRich());
|
|
||||||
}
|
}
|
||||||
return body;
|
CTTx tx = title.getTx();
|
||||||
|
if (tx.isSetStrRef()) {
|
||||||
|
tx.unsetStrRef();
|
||||||
|
}
|
||||||
|
if (!tx.isSetRich()) {
|
||||||
|
tx.addNewRich();
|
||||||
|
}
|
||||||
|
return new XDDFTextBody(parent, tx.getRich());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setText(String text) {
|
public void setText(String text) {
|
||||||
|
@ -55,10 +55,6 @@ import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;
|
|||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTx;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTx;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
|
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
|
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
import org.w3c.dom.Text;
|
import org.w3c.dom.Text;
|
||||||
@ -294,60 +290,6 @@ public final class XSSFChart extends XDDFChart implements Chart, ChartAxisFactor
|
|||||||
return new XSSFRichTextString(text.toString());
|
return new XSSFRichTextString(text.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the title text as a static string.
|
|
||||||
*
|
|
||||||
* @param newTitle
|
|
||||||
* to use
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setTitleText(String newTitle) {
|
|
||||||
CTTitle ctTitle;
|
|
||||||
if (chart.isSetTitle()) {
|
|
||||||
ctTitle = chart.getTitle();
|
|
||||||
} else {
|
|
||||||
ctTitle = chart.addNewTitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
CTTx tx;
|
|
||||||
if (ctTitle.isSetTx()) {
|
|
||||||
tx = ctTitle.getTx();
|
|
||||||
} else {
|
|
||||||
tx = ctTitle.addNewTx();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tx.isSetStrRef()) {
|
|
||||||
tx.unsetStrRef();
|
|
||||||
}
|
|
||||||
|
|
||||||
CTTextBody rich;
|
|
||||||
if (tx.isSetRich()) {
|
|
||||||
rich = tx.getRich();
|
|
||||||
} else {
|
|
||||||
rich = tx.addNewRich();
|
|
||||||
rich.addNewBodyPr(); // body properties must exist (but can be
|
|
||||||
// empty)
|
|
||||||
}
|
|
||||||
|
|
||||||
CTTextParagraph para;
|
|
||||||
if (rich.sizeOfPArray() > 0) {
|
|
||||||
para = rich.getPArray(0);
|
|
||||||
} else {
|
|
||||||
para = rich.addNewP();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (para.sizeOfRArray() > 0) {
|
|
||||||
CTRegularTextRun run = para.getRArray(0);
|
|
||||||
run.setT(newTitle);
|
|
||||||
} else if (para.sizeOfFldArray() > 0) {
|
|
||||||
CTTextField fld = para.getFldArray(0);
|
|
||||||
fld.setT(newTitle);
|
|
||||||
} else {
|
|
||||||
CTRegularTextRun run = para.addNewR();
|
|
||||||
run.setT(newTitle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the chart title formula expression if there is one
|
* Get the chart title formula expression if there is one
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user