From b326a5cd01a5dd16517f7a171a318d8bc59046db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alain=20B=C3=A9arez?= Date: Fri, 5 Oct 2018 18:07:55 +0000 Subject: [PATCH] adding tricks from other answers on StackOverflow git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1842959 13f79535-47bb-0310-9956-ffa450edef68 --- .../usermodel/examples/BarAndLineChart.java | 44 ++++++++++++-- .../poi/xssf/usermodel/examples/BarChart.java | 2 + .../usermodel/examples/BarChartExample.java | 2 +- .../poi/xddf/usermodel/chart/XDDFChart.java | 4 ++ .../poi/xddf/usermodel/chart/XDDFTitle.java | 23 ++++---- .../apache/poi/xssf/usermodel/XSSFChart.java | 58 ------------------- 6 files changed, 57 insertions(+), 76 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 index 13d4ff654..1de43cb97 100644 --- a/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java +++ b/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java @@ -22,6 +22,7 @@ package org.apache.poi.xssf.usermodel.examples; import java.io.FileOutputStream; 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.CellReference; 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.BarDirection; 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.XDDFBarChartData; 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.XDDFDataSourcesFactory; 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.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.XSSFChart; 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.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 { private static final int NUM_OF_ROWS = 7; 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); 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 XDDFCategoryDataSource xs = XDDFDataSourcesFactory.fromStringCellRange(sheet, @@ -129,8 +155,13 @@ public class BarAndLineChart { // legend XDDFChartLegend legend = chart.getOrAddLegend(); - legend.setPosition(LegendPosition.BOTTOM); + legend.setPosition(LegendPosition.LEFT); 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")) { wb.write(fileOut); @@ -150,9 +181,7 @@ public class BarAndLineChart { } private static void solidLineSeries(XDDFChartData data, int index, PresetColor color) { - XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(color)); - XDDFLineProperties line = new XDDFLineProperties(); - line.setFillProperties(fill); + XDDFLineProperties line = solidLine(color); XDDFChartData.Series series = data.getSeries().get(index); XDDFShapeProperties properties = series.getShapeProperties(); if (properties == null) { @@ -161,4 +190,11 @@ public class BarAndLineChart { properties.setLineProperties(line); 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; + } } diff --git a/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarChart.java b/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarChart.java index 3e58b912e..b3bb44b22 100644 --- a/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarChart.java +++ b/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarChart.java @@ -71,6 +71,8 @@ public class BarChart { XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); XSSFChart chart = drawing.createChart(anchor); + chart.setTitleText("x = 2x and x = 3x"); + chart.setTitleOverlay(false); XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.TOP_RIGHT); diff --git a/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java b/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java index 9950ffebd..ebce9410d 100644 --- a/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java +++ b/src/examples/src/org/apache/poi/xwpf/usermodel/examples/BarChartExample.java @@ -118,7 +118,7 @@ public class BarChartExample { chart.plot(bar); chart.setTitleText(chartTitle); // https://stackoverflow.com/questions/30532612 - // chart.setTitleOverlay(overlay); + chart.setTitleOverlay(false); } private static void setColumnData(XWPFChart chart, String chartTitle) { diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java index 5022a75a2..321626d71 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java @@ -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 */ public void setTitleText(String text) { diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFTitle.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFTitle.java index bca40fc8b..8df7b9a71 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFTitle.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFTitle.java @@ -39,20 +39,17 @@ public class XDDFTitle { } public XDDFTextBody getBody() { - XDDFTextBody body; - if (title.isSetTxPr()) { - 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()); + if (!title.isSetTx()) { + title.addNewTx(); } - 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) { 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 d7971839f..345b8652d 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java @@ -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.CTTx; 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.NodeList; import org.w3c.dom.Text; @@ -294,60 +290,6 @@ public final class XSSFChart extends XDDFChart implements Chart, ChartAxisFactor 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 *