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:
Alain Béarez 2018-10-05 18:07:55 +00:00
parent c66af5c21e
commit b326a5cd01
6 changed files with 57 additions and 76 deletions

View File

@ -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;
}
} }

View File

@ -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);

View File

@ -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) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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
* *