You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ab...@apache.org on 2019/05/21 23:28:16 UTC

svn commit: r1859676 - in /poi/trunk/src: examples/src/org/apache/poi/xssf/usermodel/examples/ ooxml/java/org/apache/poi/xddf/usermodel/ ooxml/java/org/apache/poi/xddf/usermodel/chart/ ooxml/java/org/apache/poi/xddf/usermodel/text/

Author: abearez
Date: Tue May 21 23:28:15 2019
New Revision: 1859676

URL: http://svn.apache.org/viewvc?rev=1859676&view=rev
Log:
code inspired from Axel Richter on StackOverflow

closes #139
closes #144

Added:
    poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/ExcelChartWithTargetLine.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/Angles.java
Modified:
    poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFLineProperties.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFLinearShadeProperties.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFTransform2D.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFArea3DChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFAreaChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBar3DChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFCategoryAxis.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFCategoryDataSource.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartAxis.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSource.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSourcesFactory.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDateAxis.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLegendEntry.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLine3DChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLineChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFNumericalDataSource.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFPie3DChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFPieChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFRadarChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFScatterChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSeriesAxis.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSurface3DChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSurfaceChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFValueAxis.java
    poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFRunProperties.java

Modified: poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java (original)
+++ poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BarAndLineChart.java Tue May 21 23:28:15 2019
@@ -27,8 +27,8 @@ import org.apache.poi.ss.util.CellRangeA
 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.XDDFFillProperties;
 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;
@@ -36,10 +36,10 @@ import org.apache.poi.xddf.usermodel.cha
 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.MarkerStyle;
 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;
@@ -97,12 +97,13 @@ public class BarAndLineChart {
             properties.setItalic(true);
             properties.setUnderline(UnderlineType.DOT_DOT_DASH_HEAVY);
             properties.setFontSize(22.5);
-            XDDFFont[] fonts = new XDDFFont[]{
+            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));
+            properties.setLineProperties(new XDDFLineProperties(
+                    new XDDFSolidFillProperties(XDDFColor.from(PresetColor.SIENNA))));
             XDDFTextParagraph paragraph = chart.getTitle().getBody().getParagraph(0);
             paragraph.setDefaultRunProperties(properties);
 
@@ -136,7 +137,7 @@ public class BarAndLineChart {
             // the bar chart
             XDDFBarChartData bar = (XDDFBarChartData) chart.createData(ChartTypes.BAR, barCategories, leftValues);
             XDDFBarChartData.Series series1 = (XDDFBarChartData.Series) bar.addSeries(xs, ys1);
-            series1.setTitle("Bars", new CellReference("Sheet1!$B$1"));
+            series1.setTitle(null, new CellReference(sheet.getSheetName(), 0, 1, true,true));
             bar.setVaryColors(true);
             bar.setBarDirection(BarDirection.COL);
             chart.plot(bar);
@@ -152,15 +153,20 @@ public class BarAndLineChart {
 
 
             XDDFLineChartData.Series series2 = (XDDFLineChartData.Series) lines.addSeries(xs, ys2);
-            series2.setIndex(1);
-            series2.setOrder(1);
-            series2.setTitle("Lines", new CellReference("Sheet1!$C$1"));
+            series2.setTitle(null, new CellReference(sheet.getSheetName(), 0, 2, true, true));
+            series2.setSmooth(false);
+            series2.setMarkerStyle(MarkerStyle.DIAMOND);
+            series2.setMarkerSize((short)14);
             lines.setVaryColors(true);
             chart.plot(lines);
 
             // some colors
-            solidFillSeries(bar, 0, PresetColor.CHARTREUSE);
-            solidLineSeries(lines, 0, PresetColor.TURQUOISE);
+            XDDFFillProperties solidChartreuse = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.CHARTREUSE));
+            XDDFFillProperties solidTurquoise = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.TURQUOISE));
+            XDDFLineProperties solidLines = new XDDFLineProperties(solidTurquoise);
+            series1.setFillProperties(solidChartreuse);
+            series1.setLineProperties(solidLines); // bar border color different from fill
+            series2.setLineProperties(solidLines);
 
             // legend
             XDDFChartLegend legend = chart.getOrAddLegend();
@@ -177,33 +183,4 @@ public class BarAndLineChart {
             }
         }
     }
-
-    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) {
-        XDDFLineProperties line = solidLine(color);
-        XDDFChartData.Series series = data.getSeries().get(index);
-        XDDFShapeProperties properties = series.getShapeProperties();
-        if (properties == null) {
-            properties = new XDDFShapeProperties();
-        }
-        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;
-    }
 }

Added: poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/ExcelChartWithTargetLine.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/ExcelChartWithTargetLine.java?rev=1859676&view=auto
==============================================================================
--- poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/ExcelChartWithTargetLine.java (added)
+++ poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/ExcelChartWithTargetLine.java Tue May 21 23:28:15 2019
@@ -0,0 +1,230 @@
+/*
+ *  ====================================================================
+ *    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 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.XDDFFillProperties;
+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.AxisPosition;
+import org.apache.poi.xddf.usermodel.chart.AxisTickLabelPosition;
+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.XDDFChartLegend;
+import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
+import org.apache.poi.xddf.usermodel.chart.XDDFLegendEntry;
+import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
+import org.apache.poi.xddf.usermodel.chart.XDDFScatterChartData;
+import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
+import org.apache.poi.xddf.usermodel.text.XDDFRunProperties;
+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;
+
+/**
+ * This example is based on original contributions by Axel Richter on StackOverflow.
+ *
+ * <em>Note from original author</em>:
+ * This only works for Excel since OpenOffice or LibreOffice Calc is not able having series having literal numeric values set.
+ *
+ * @see <a href="https://stackoverflow.com/questions/50772989/">Create target marker in a bar chart with openxmlformats</a>
+ * @see <a href="https://stackoverflow.com/questions/50873700/">Change axis color and font of the chart in openxmlformats</a>
+ * @see <a href="https://stackoverflow.com/questions/51530552/">Change colors of line chart Apache POI</a>
+ */
+class ExcelChartWithTargetLine {
+
+    private static final int NUM_OF_ROWS = 6;
+
+    private static void createChart(XSSFChart chart, XSSFSheet sheet, int[] chartedCols, double target) {
+        // some colors
+        XDDFFillProperties[] fills = new XDDFFillProperties[] {
+            new XDDFSolidFillProperties(XDDFColor.from(PresetColor.TURQUOISE)),
+            new XDDFSolidFillProperties(XDDFColor.from(PresetColor.CHARTREUSE)),
+            new XDDFSolidFillProperties(XDDFColor.from(PresetColor.LAVENDER)),
+            new XDDFSolidFillProperties(XDDFColor.from(PresetColor.CHOCOLATE)),
+            new XDDFSolidFillProperties(XDDFColor.from(PresetColor.TOMATO)),
+            new XDDFSolidFillProperties(XDDFColor.from(PresetColor.PLUM))
+        };
+        XDDFLineProperties solidTurquoise = new XDDFLineProperties(fills[0]);
+        XDDFLineProperties solidTomato = new XDDFLineProperties(fills[4]);
+        XDDFLineProperties solidPlum = new XDDFLineProperties(fills[5]);
+        XDDFSolidFillProperties solidAlmond = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.BLANCHED_ALMOND));
+        XDDFSolidFillProperties solidGray = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.DARK_SLATE_GRAY));
+
+
+        // the bar chart
+
+        XDDFCategoryAxis barCategories = chart.createCategoryAxis(AxisPosition.BOTTOM);
+        XDDFValueAxis leftValues = chart.createValueAxis(AxisPosition.LEFT);
+        leftValues.crossAxis(barCategories);
+        barCategories.crossAxis(leftValues);
+
+        // from https://stackoverflow.com/questions/50873700/
+        // colored major grid lines
+        leftValues.getOrAddMajorGridProperties().setLineProperties(solidTomato);
+        //colored axis line
+        leftValues.getOrAddShapeProperties().setLineProperties(solidPlum);
+        // axis font
+        XDDFRunProperties props = leftValues.getOrAddTextProperties();
+        props.setFontSize(14.0);
+        props.setFillProperties(fills[5]);
+
+        XDDFBarChartData bar = (XDDFBarChartData) chart.createData(ChartTypes.BAR, barCategories, leftValues);
+        bar.setVaryColors(true);
+        bar.setBarDirection(chartedCols.length > 1 ? BarDirection.COL : BarDirection.BAR);
+
+        for (int c : chartedCols) {
+            // the data sources
+            XDDFCategoryDataSource xs = XDDFDataSourcesFactory.fromStringCellRange(sheet,
+                    new CellRangeAddress(1, NUM_OF_ROWS, 0, 0));
+            XDDFNumericalDataSource<Double> ys = XDDFDataSourcesFactory.fromNumericCellRange(sheet,
+                    new CellRangeAddress(1, NUM_OF_ROWS, c, c));
+            XDDFBarChartData.Series series = (XDDFBarChartData.Series) bar.addSeries(xs, ys);
+            series.setTitle(null, new CellReference(sheet.getSheetName(), 0, c, true, true));
+            series.setFillProperties(fills[c]);
+            series.setLineProperties(solidTurquoise); // bar border color different from fill
+        }
+        chart.plot(bar);
+
+
+        // target line
+        // line of a scatter chart from 0 (min) to 1 (max) having value of target
+
+        XDDFValueAxis scatterX = chart.createValueAxis(AxisPosition.TOP);
+        scatterX.setVisible(false);
+        scatterX.setTickLabelPosition(AxisTickLabelPosition.NONE);
+        XDDFValueAxis scatterY = chart.createValueAxis(AxisPosition.RIGHT);
+        scatterY.setVisible(false);
+        scatterY.setTickLabelPosition(AxisTickLabelPosition.NONE);
+        scatterX.crossAxis(scatterY);
+        scatterY.crossAxis(scatterX);
+        if (chartedCols.length > 1) {
+            scatterX.setMaximum(1.0);
+        } else {
+            scatterY.setMaximum(1.0);
+        }
+
+        XDDFScatterChartData scatter = (XDDFScatterChartData) chart.createData(ChartTypes.SCATTER, scatterX, scatterY);
+        scatter.setVaryColors(true);
+
+        //  This only works for Excel since OpenOffice or LibreOffice Calc does not support literal numeric data series.
+        XDDFNumericalDataSource<Double> targetDS = XDDFDataSourcesFactory.fromArray(new Double[] { target, target });
+        XDDFNumericalDataSource<Double> zeroOneDS = XDDFDataSourcesFactory.fromArray(new Double[] { 0.0, 1.0 });
+
+        if (chartedCols.length > 1) {
+            // BarDirection.COL then X axis is from 0 to 1 and Y axis is target axis
+            scatter.addSeries(zeroOneDS, targetDS).setLineProperties(solidTurquoise);
+        } else {
+            // BarDirection.BAR then X axis is target axis and Y axis is from 0 to 1
+            scatter.addSeries(targetDS, zeroOneDS).setLineProperties(solidTurquoise);
+        }
+
+        chart.plot(scatter);
+
+
+        // legend
+        if (chartedCols.length > 1) {
+            XDDFChartLegend legend = chart.getOrAddLegend();
+            legend.setPosition(LegendPosition.LEFT);
+            legend.setOverlay(false);
+
+            // delete additional target line series legend entry
+            XDDFLegendEntry entry = legend.addEntry();
+            entry.setIndex(0);
+            entry.setDelete(true);
+        }
+
+
+        // from https://stackoverflow.com/questions/51530552/
+        // customize the chart
+
+        // do not auto delete the title
+        chart.setAutoTitleDeleted(false);
+
+        // plot area background and border line
+        XDDFShapeProperties chartProps = chart.getOrAddShapeProperties();
+        chartProps.setFillProperties(solidAlmond);
+        chartProps.setLineProperties(new XDDFLineProperties(solidGray));
+
+        // line style of cat axis
+        XDDFLineProperties categoriesProps = new XDDFLineProperties(solidGray);
+        categoriesProps.setWidth(2.1);
+        barCategories.getOrAddShapeProperties().setLineProperties(categoriesProps);
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        XSSFWorkbook workbook = new XSSFWorkbook();
+        XSSFSheet sheet = workbook.createSheet("targetline");
+        final int NUM_OF_COLUMNS = 4;
+
+        // create some data
+        XSSFRow row;
+        XSSFCell cell;
+        String[] headings = new String[] { "Year", "Male", "Female", "Other" };
+        int rowIndex = 0;
+        row = sheet.createRow(rowIndex);
+        for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++) {
+            cell = row.createCell(colIndex);
+            cell.setCellValue(headings[colIndex]);
+        }
+        double[][] values = new double[][] { new double[] { 1980, 56.0, 44.1, 12.2 },
+                new double[] { 1985, 34.5, 41.0, 4 }, new double[] { 1990, 65.0, 68.5, 9.1 },
+                new double[] { 1995, 34.7, 47.6, 4.9 }, new double[] { 2000, 23.0, 64.5, 11.1 },
+                new double[] { 2005, 56.3, 69.8, 9.5 } };
+        for (; rowIndex < NUM_OF_ROWS; rowIndex++) {
+            row = sheet.createRow(rowIndex + 1);
+            for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++) {
+                cell = row.createCell(colIndex);
+                cell.setCellValue(values[rowIndex][colIndex]);
+            }
+        }
+
+        int[] chartedCols = new int[] {  1,  2  , 3  };
+
+        XSSFDrawing drawing = sheet.createDrawingPatriarch();
+        XSSFClientAnchor anchor = null;
+        if (chartedCols.length > 1) {
+            anchor = drawing.createAnchor(0, 0, 0, 0, 0, 8, 10, 23);
+        } else {
+            anchor = drawing.createAnchor(0, 0, 0, 0, 0, 8, 5, 23);
+        }
+        XSSFChart chart = drawing.createChart(anchor);
+        createChart(chart, sheet, chartedCols, 42.0);
+
+        workbook.write(new FileOutputStream("ExcelChartWithTargetLine.xlsx"));
+        workbook.close();
+
+    }
+}

Added: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/Angles.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/Angles.java?rev=1859676&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/Angles.java (added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/Angles.java Tue May 21 23:28:15 2019
@@ -0,0 +1,36 @@
+/* ====================================================================
+   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.xddf.usermodel;
+
+public class Angles {
+    /**
+     * OOXML represents an angle in 60,000ths of a degree.
+     *
+     * Positive angles are clockwise (i.e., towards the positive y axis);
+     * negative angles are counter-clockwise (i.e., towards the negative y axis).
+     */
+    public static final int OOXML_DEGREE = 60_000;
+
+    public static final int degreesToAttribute(double angle) {
+        return (int) (OOXML_DEGREE * angle);
+    }
+
+    public static final double attributeToDegrees(int angle) {
+        return angle / ((double) OOXML_DEGREE);
+    }
+}

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFLineProperties.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFLineProperties.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFLineProperties.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFLineProperties.java Tue May 21 23:28:15 2019
@@ -23,6 +23,7 @@ import java.util.stream.Collectors;
 
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.Units;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;
 
 @Beta
@@ -33,6 +34,16 @@ public class XDDFLineProperties {
         this(CTLineProperties.Factory.newInstance());
     }
 
+    /**
+     * @param fill
+     *      fill properties to set on the new line properties.
+     * @since POI 4.0.2
+     */
+    public XDDFLineProperties(XDDFFillProperties fill) {
+        this();
+        this.setFillProperties(fill);
+    }
+
     @Internal
     public XDDFLineProperties(CTLineProperties properties) {
         this.props = properties;
@@ -293,21 +304,29 @@ public class XDDFLineProperties {
         }
     }
 
-    public Integer getWidth() {
+    /**
+     * @return the width expressed in points.
+     */
+    public Double getWidth() {
         if (props.isSetW()) {
-            return props.getW();
+            return Units.toPoints(props.getW());
         } else {
             return null;
         }
     }
 
-    public void setWidth(Integer width) {
+    /**
+     * Internally converts the width to EMU units.
+     *
+     * @param width expressed in points.
+     */
+    public void setWidth(Double width) {
         if (width == null) {
             if (props.isSetW()) {
                 props.unsetW();
             }
         } else {
-            props.setW(width);
+            props.setW(Units.toEMU(width));
         }
     }
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFLinearShadeProperties.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFLinearShadeProperties.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFLinearShadeProperties.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFLinearShadeProperties.java Tue May 21 23:28:15 2019
@@ -34,21 +34,24 @@ public class XDDFLinearShadeProperties {
         return props;
     }
 
-    public Integer getAngle() {
+    public Double getAngle() {
         if (props.isSetAng()) {
-            return props.getAng();
+            return Angles.attributeToDegrees(props.getAng());
         } else {
             return null;
         }
     }
 
-    public void setAngle(Integer angle) {
+    public void setAngle(Double angle) {
         if (angle == null) {
             if (props.isSetAng()) {
                 props.unsetAng();
             }
         } else {
-            props.setAng(angle);
+            if (angle < 0.0 || 360.0 <= angle) {
+                throw new IllegalArgumentException("angle must be in the range [0, 360).");
+            }
+            props.setAng(Angles.degreesToAttribute(angle));
         }
     }
 

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFTransform2D.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFTransform2D.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFTransform2D.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFTransform2D.java Tue May 21 23:28:15 2019
@@ -120,21 +120,21 @@ public class XDDFTransform2D {
         xformOff.setY(offset.getY());
     }
 
-    public Integer getRotation() {
+    public Double getRotation() {
         if (transform.isSetRot()) {
-            return transform.getRot();
+            return Angles.attributeToDegrees(transform.getRot());
         } else {
             return null;
         }
     }
 
-    public void setRotation(Integer rotation) {
+    public void setRotation(Double rotation) {
         if (rotation == null) {
             if (transform.isSetRot()) {
                 transform.unsetRot();
             }
         } else {
-            transform.setRot(rotation);
+            transform.setRot(Angles.degreesToAttribute(rotation));
         }
     }
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFArea3DChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFArea3DChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFArea3DChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFArea3DChartData.java Tue May 21 23:28:15 2019
@@ -32,8 +32,13 @@ import org.openxmlformats.schemas.drawin
 public class XDDFArea3DChartData extends XDDFChartData {
     private CTArea3DChart chart;
 
-    public XDDFArea3DChartData(CTArea3DChart chart, Map<Long, XDDFChartAxis> categories,
+    @Internal
+    protected XDDFArea3DChartData(
+            XDDFChart parent,
+            CTArea3DChart chart,
+            Map<Long, XDDFChartAxis> categories,
             Map<Long, XDDFValueAxis> values) {
+        super(parent);
         this.chart = chart;
         for (CTAreaSer series : chart.getSerList()) {
             this.series.add(new Series(series, series.getCat(), series.getVal()));
@@ -202,12 +207,12 @@ public class XDDFArea3DChartData extends
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFAreaChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFAreaChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFAreaChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFAreaChartData.java Tue May 21 23:28:15 2019
@@ -32,8 +32,13 @@ import org.openxmlformats.schemas.drawin
 public class XDDFAreaChartData extends XDDFChartData {
     private CTAreaChart chart;
 
-    public XDDFAreaChartData(CTAreaChart chart, Map<Long, XDDFChartAxis> categories,
+    @Internal
+    protected XDDFAreaChartData(
+            XDDFChart parent,
+            CTAreaChart chart,
+            Map<Long, XDDFChartAxis> categories,
             Map<Long, XDDFValueAxis> values) {
+        super(parent);
         this.chart = chart;
         for (CTAreaSer series : chart.getSerList()) {
             this.series.add(new Series(series, series.getCat(), series.getVal()));
@@ -180,12 +185,12 @@ public class XDDFAreaChartData extends X
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBar3DChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBar3DChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBar3DChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBar3DChartData.java Tue May 21 23:28:15 2019
@@ -32,8 +32,13 @@ import org.openxmlformats.schemas.drawin
 public class XDDFBar3DChartData extends XDDFChartData {
     private CTBar3DChart chart;
 
-    public XDDFBar3DChartData(CTBar3DChart chart, Map<Long, XDDFChartAxis> categories,
+    @Internal
+    protected XDDFBar3DChartData(
+            XDDFChart parent,
+            CTBar3DChart chart,
+            Map<Long, XDDFChartAxis> categories,
             Map<Long, XDDFValueAxis> values) {
+        super(parent);
         this.chart = chart;
         if (chart.getBarDir() == null) {
             chart.addNewBarDir().setVal(BarDirection.BAR.underlying);
@@ -258,12 +263,12 @@ public class XDDFBar3DChartData extends
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java Tue May 21 23:28:15 2019
@@ -32,8 +32,13 @@ import org.openxmlformats.schemas.drawin
 public class XDDFBarChartData extends XDDFChartData {
     private CTBarChart chart;
 
-    public XDDFBarChartData(CTBarChart chart, Map<Long, XDDFChartAxis> categories,
+    @Internal
+    protected XDDFBarChartData(
+            XDDFChart parent,
+            CTBarChart chart,
+            Map<Long, XDDFChartAxis> categories,
             Map<Long, XDDFValueAxis> values) {
+        super(parent);
         this.chart = chart;
         if (chart.getBarDir() == null) {
             chart.addNewBarDir().setVal(BarDirection.BAR.underlying);
@@ -163,7 +168,7 @@ public class XDDFBarChartData extends XD
     @Override
     public XDDFChartData.Series addSeries(XDDFDataSource<?> category,
             XDDFNumericalDataSource<? extends Number> values) {
-        final int index = this.series.size();
+        final long index = this.parent.incrementSeriesCount();
         final CTBarSer ctSer = this.chart.addNewSer();
         ctSer.addNewTx();
         ctSer.addNewCat();

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFCategoryAxis.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFCategoryAxis.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFCategoryAxis.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFCategoryAxis.java Tue May 21 23:28:15 2019
@@ -19,6 +19,7 @@ package org.apache.poi.xddf.usermodel.ch
 
 import org.apache.poi.util.Beta;
 import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
+import org.apache.poi.xddf.usermodel.text.XDDFRunProperties;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
@@ -27,10 +28,11 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickLblPos;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickMark;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt;
-import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
 
 @Beta
 public class XDDFCategoryAxis extends XDDFChartAxis {
@@ -75,11 +77,24 @@ public class XDDFCategoryAxis extends XD
         } else {
             properties = ctCatAx.addNewSpPr();
         }
-
         return new XDDFShapeProperties(properties);
     }
 
     /**
+     * @since POI 4.0.2
+     */
+    @Override
+    public XDDFRunProperties getOrAddTextProperties() {
+        CTTextBody text;
+        if (ctCatAx.isSetTxPr()) {
+            text = ctCatAx.getTxPr();
+        } else {
+            text = ctCatAx.addNewTxPr();
+        }
+        return new XDDFRunProperties(getOrAddTextProperties(text));
+    }
+
+    /**
      * @since 4.0.1
      */
     @Override
@@ -180,6 +195,11 @@ public class XDDFCategoryAxis extends XD
         return ctCatAx.getMinorTickMark();
     }
 
+    @Override
+    protected CTTickLblPos getCTTickLblPos() {
+        return ctCatAx.getTickLblPos();
+    }
+
     public AxisLabelAlignment getLabelAlignment() {
         return AxisLabelAlignment.valueOf(ctCatAx.getLblAlgn().getVal());
     }
@@ -196,7 +216,7 @@ public class XDDFCategoryAxis extends XD
         ctCatAx.addNewScaling();
         ctCatAx.addNewCrosses();
         ctCatAx.addNewCrossAx();
-        ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
+        ctCatAx.addNewTickLblPos();
         ctCatAx.addNewDelete();
         ctCatAx.addNewMajorTickMark();
         ctCatAx.addNewMinorTickMark();
@@ -207,5 +227,6 @@ public class XDDFCategoryAxis extends XD
         setVisible(true);
         setMajorTickMark(AxisTickMark.CROSS);
         setMinorTickMark(AxisTickMark.NONE);
+        setTickLabelPosition(AxisTickLabelPosition.NEXT_TO);
     }
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFCategoryDataSource.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFCategoryDataSource.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFCategoryDataSource.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFCategoryDataSource.java Tue May 21 23:28:15 2019
@@ -29,6 +29,11 @@ public interface XDDFCategoryDataSource
     }
 
     @Override
+    default boolean isLiteral() {
+        return false;
+    }
+
+    @Override
     default boolean isNumeric() {
         return false;
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java Tue May 21 23:28:15 2019
@@ -383,11 +383,23 @@ public abstract class XDDFChart extends
         return new XDDFManualLayout(chart.getPlotArea());
     }
 
+    private long seriesCount = 0;
+    protected long incrementSeriesCount() {
+        return seriesCount++;
+    }
+
     public void plot(XDDFChartData data) {
         XSSFSheet sheet = getSheet();
         for (XDDFChartData.Series series : data.getSeries()) {
             series.plot();
-            fillSheet(sheet, series.getCategoryData(), series.getValuesData());
+            XDDFDataSource<?> categoryDS = series.getCategoryData();
+            XDDFNumericalDataSource<? extends Number> valuesDS = series.getValuesData();
+            if (categoryDS.isReference() || valuesDS.isReference()
+                    || categoryDS.isLiteral() || valuesDS.isLiteral()) {
+                // let's assume the data is already in the sheet
+            } else {
+                fillSheet(sheet, categoryDS, valuesDS);
+            }
         }
     }
 
@@ -399,62 +411,62 @@ public abstract class XDDFChart extends
 
         for (int i = 0; i < plotArea.sizeOfAreaChartArray(); i++) {
             CTAreaChart areaChart = plotArea.getAreaChartArray(i);
-            series.add(new XDDFAreaChartData(areaChart, categories, values));
+            series.add(new XDDFAreaChartData(this, areaChart, categories, values));
         }
 
         for (int i = 0; i < plotArea.sizeOfArea3DChartArray(); i++) {
             CTArea3DChart areaChart = plotArea.getArea3DChartArray(i);
-            series.add(new XDDFArea3DChartData(areaChart, categories, values));
+            series.add(new XDDFArea3DChartData(this, areaChart, categories, values));
         }
 
         for (int i = 0; i < plotArea.sizeOfBarChartArray(); i++) {
             CTBarChart barChart = plotArea.getBarChartArray(i);
-            series.add(new XDDFBarChartData(barChart, categories, values));
+            series.add(new XDDFBarChartData(this, barChart, categories, values));
         }
 
         for (int i = 0; i < plotArea.sizeOfBar3DChartArray(); i++) {
             CTBar3DChart barChart = plotArea.getBar3DChartArray(i);
-            series.add(new XDDFBar3DChartData(barChart, categories, values));
+            series.add(new XDDFBar3DChartData(this, barChart, categories, values));
         }
 
         for (int i = 0; i < plotArea.sizeOfLineChartArray(); i++) {
             CTLineChart lineChart = plotArea.getLineChartArray(i);
-            series.add(new XDDFLineChartData(lineChart, categories, values));
+            series.add(new XDDFLineChartData(this, lineChart, categories, values));
         }
 
         for (int i = 0; i < plotArea.sizeOfLine3DChartArray(); i++) {
             CTLine3DChart lineChart = plotArea.getLine3DChartArray(i);
-            series.add(new XDDFLine3DChartData(lineChart, categories, values));
+            series.add(new XDDFLine3DChartData(this, lineChart, categories, values));
         }
 
         for (int i = 0; i < plotArea.sizeOfPieChartArray(); i++) {
             CTPieChart pieChart = plotArea.getPieChartArray(i);
-            series.add(new XDDFPieChartData(pieChart));
+            series.add(new XDDFPieChartData(this, pieChart));
         }
 
         for (int i = 0; i < plotArea.sizeOfPie3DChartArray(); i++) {
             CTPie3DChart pieChart = plotArea.getPie3DChartArray(i);
-            series.add(new XDDFPie3DChartData(pieChart));
+            series.add(new XDDFPie3DChartData(this, pieChart));
         }
 
         for (int i = 0; i < plotArea.sizeOfRadarChartArray(); i++) {
             CTRadarChart radarChart = plotArea.getRadarChartArray(i);
-            series.add(new XDDFRadarChartData(radarChart, categories, values));
+            series.add(new XDDFRadarChartData(this, radarChart, categories, values));
         }
 
         for (int i = 0; i < plotArea.sizeOfScatterChartArray(); i++) {
             CTScatterChart scatterChart = plotArea.getScatterChartArray(i);
-            series.add(new XDDFScatterChartData(scatterChart, categories, values));
+            series.add(new XDDFScatterChartData(this, scatterChart, categories, values));
         }
 
         for (int i = 0; i < plotArea.sizeOfSurfaceChartArray(); i++) {
             CTSurfaceChart surfaceChart = plotArea.getSurfaceChartArray(i);
-            series.add(new XDDFSurfaceChartData(surfaceChart, categories, values));
+            series.add(new XDDFSurfaceChartData(this, surfaceChart, categories, values));
         }
 
         for (int i = 0; i < plotArea.sizeOfSurface3DChartArray(); i++) {
             CTSurface3DChart surfaceChart = plotArea.getSurface3DChartArray(i);
-            series.add(new XDDFSurface3DChartData(surfaceChart, categories, values));
+            series.add(new XDDFSurface3DChartData(this, surfaceChart, categories, values));
         }
 
         // TODO repeat above code for missing charts: Bubble, Doughnut, OfPie and Stock
@@ -553,29 +565,29 @@ public abstract class XDDFChart extends
         final CTPlotArea plotArea = getCTPlotArea();
         switch (type) {
         case AREA:
-            return new XDDFAreaChartData(plotArea.addNewAreaChart(), categories, mapValues);
+            return new XDDFAreaChartData(this, plotArea.addNewAreaChart(), categories, mapValues);
         case AREA3D:
-            return new XDDFArea3DChartData(plotArea.addNewArea3DChart(), categories, mapValues);
+            return new XDDFArea3DChartData(this, plotArea.addNewArea3DChart(), categories, mapValues);
         case BAR:
-            return new XDDFBarChartData(plotArea.addNewBarChart(), categories, mapValues);
+            return new XDDFBarChartData(this, plotArea.addNewBarChart(), categories, mapValues);
         case BAR3D:
-            return new XDDFBar3DChartData(plotArea.addNewBar3DChart(), categories, mapValues);
+            return new XDDFBar3DChartData(this, plotArea.addNewBar3DChart(), categories, mapValues);
         case LINE:
-            return new XDDFLineChartData(plotArea.addNewLineChart(), categories, mapValues);
+            return new XDDFLineChartData(this, plotArea.addNewLineChart(), categories, mapValues);
         case LINE3D:
-            return new XDDFLine3DChartData(plotArea.addNewLine3DChart(), categories, mapValues);
+            return new XDDFLine3DChartData(this, plotArea.addNewLine3DChart(), categories, mapValues);
         case PIE:
-            return new XDDFPieChartData(plotArea.addNewPieChart());
+            return new XDDFPieChartData(this, plotArea.addNewPieChart());
         case PIE3D:
-            return new XDDFPie3DChartData(plotArea.addNewPie3DChart());
+            return new XDDFPie3DChartData(this, plotArea.addNewPie3DChart());
         case RADAR:
-            return new XDDFRadarChartData(plotArea.addNewRadarChart(), categories, mapValues);
+            return new XDDFRadarChartData(this, plotArea.addNewRadarChart(), categories, mapValues);
         case SCATTER:
-            return new XDDFScatterChartData(plotArea.addNewScatterChart(), categories, mapValues);
+            return new XDDFScatterChartData(this, plotArea.addNewScatterChart(), categories, mapValues);
         case SURFACE:
-            return new XDDFSurfaceChartData(plotArea.addNewSurfaceChart(), categories, mapValues);
+            return new XDDFSurfaceChartData(this, plotArea.addNewSurfaceChart(), categories, mapValues);
         case SURFACE3D:
-            return new XDDFSurface3DChartData(plotArea.addNewSurface3DChart(), categories, mapValues);
+            return new XDDFSurface3DChartData(this, plotArea.addNewSurface3DChart(), categories, mapValues);
         default:
             return null;
         }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartAxis.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartAxis.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartAxis.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartAxis.java Tue May 21 23:28:15 2019
@@ -20,6 +20,7 @@ package org.apache.poi.xddf.usermodel.ch
 import org.apache.poi.util.Beta;
 import org.apache.poi.xddf.usermodel.HasShapeProperties;
 import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
+import org.apache.poi.xddf.usermodel.text.XDDFRunProperties;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartLines;
@@ -27,9 +28,14 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickLblPos;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickMark;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;
 
 /**
  * Base class for all axis types.
@@ -52,11 +58,18 @@ public abstract class XDDFChartAxis impl
 
     protected abstract CTTickMark getMinorCTTickMark();
 
+    protected abstract CTTickLblPos getCTTickLblPos();
+
     public abstract XDDFShapeProperties getOrAddMajorGridProperties();
 
     public abstract XDDFShapeProperties getOrAddMinorGridProperties();
 
     /**
+     * @since POI 4.0.2
+     */
+    public abstract XDDFRunProperties getOrAddTextProperties();
+
+    /**
      * @since 4.0.1
      */
     public abstract void setTitle(String text);
@@ -342,6 +355,48 @@ public abstract class XDDFChartAxis impl
         getMinorCTTickMark().setVal(tickMark.underlying);
     }
 
+    /**
+     * @return tick label position.
+     * @since POI 4.0.2
+     */
+    public AxisTickLabelPosition getTickLabelPosition() {
+        return AxisTickLabelPosition.valueOf(getCTTickLblPos().getVal());
+    }
+
+    /**
+     * @param labelPosition
+     *            tick label position.
+     * @since POI 4.0.2
+     */
+    public void setTickLabelPosition(AxisTickLabelPosition labelPosition) {
+        getCTTickLblPos().setVal(labelPosition.underlying);
+    }
+
+    protected CTTextCharacterProperties getOrAddTextProperties(CTTextBody body) {
+        CTTextCharacterProperties properties;
+        if (body.getBodyPr() == null) {
+            body.addNewBodyPr();
+        }
+        CTTextParagraph paragraph;
+        if (body.sizeOfPArray() > 0) {
+            paragraph = body.getPArray(0);
+        } else {
+            paragraph = body.addNewP();
+        }
+        CTTextParagraphProperties paraprops;
+        if (paragraph.isSetPPr()) {
+            paraprops = paragraph.getPPr();
+        } else {
+            paraprops = paragraph.addNewPPr();
+        }
+        if (paraprops.isSetDefRPr()) {
+            properties = paraprops.getDefRPr();
+        } else {
+            properties = paraprops.addNewDefRPr();
+        }
+        return properties;
+    }
+
     protected CTShapeProperties getOrAddLinesProperties(CTChartLines gridlines) {
         CTShapeProperties properties;
         if (gridlines.isSetSpPr()) {

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChartData.java Tue May 21 23:28:15 2019
@@ -26,6 +26,8 @@ import java.util.Map;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.xddf.usermodel.XDDFFillProperties;
+import org.apache.poi.xddf.usermodel.XDDFLineProperties;
 import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumData;
@@ -43,11 +45,13 @@ import org.openxmlformats.schemas.drawin
  */
 @Beta
 public abstract class XDDFChartData {
+    protected XDDFChart parent;
     protected List<Series> series;
     private XDDFCategoryAxis categoryAxis;
     private List<XDDFValueAxis> valueAxes;
 
-    protected XDDFChartData() {
+    protected XDDFChartData(XDDFChart chart) {
+        this.parent = chart;
         this.series = new ArrayList<>();
     }
 
@@ -181,18 +185,20 @@ public abstract class XDDFChartData {
                 } else {
                     ref = getSeriesText().addNewStrRef();
                 }
-                CTStrData cache;
-                if (ref.isSetStrCache()) {
-                    cache = ref.getStrCache();
-                } else {
-                    cache = ref.addNewStrCache();
-                }
-                if (cache.sizeOfPtArray() < 1) {
-                    cache.addNewPtCount().setVal(1);
-                    cache.addNewPt().setIdx(0);
-                }
-                cache.getPtArray(0).setV(title);
                 ref.setF(titleRef.formatAsString());
+                if (title != null) {
+                    CTStrData cache;
+                    if (ref.isSetStrCache()) {
+                        cache = ref.getStrCache();
+                    } else {
+                        cache = ref.addNewStrCache();
+                    }
+                    if (cache.sizeOfPtArray() < 1) {
+                        cache.addNewPtCount().setVal(1);
+                        cache.addNewPt().setIdx(0);;
+                    }
+                    cache.getPtArray(0).setV(title);
+                }
             }
         }
 
@@ -217,6 +223,34 @@ public abstract class XDDFChartData {
             fillNumCache(cache, numOfPoints, valuesData);
         }
 
+        /**
+         * @param fill
+         *      fill property for the shape representing the series.
+         * @since POI 4.1.1
+         */
+        public void setFillProperties(XDDFFillProperties fill) {
+            XDDFShapeProperties properties = getShapeProperties();
+            if (properties == null) {
+                properties = new XDDFShapeProperties();
+            }
+            properties.setFillProperties(fill);
+            setShapeProperties(properties);
+        }
+
+        /**
+         * @param line
+         *      line property for the shape representing the series.
+         * @since POI 4.1.1
+         */
+        public void setLineProperties(XDDFLineProperties line) {
+            XDDFShapeProperties properties = getShapeProperties();
+            if (properties == null) {
+                properties = new XDDFShapeProperties();
+            }
+            properties.setLineProperties(line);
+            setShapeProperties(properties);
+        }
+
         private CTNumData retrieveNumCache(final CTAxDataSource axDataSource, XDDFDataSource<?> data) {
             CTNumData numCache;
             if (data.isReference()) {
@@ -312,17 +346,19 @@ public abstract class XDDFChartData {
 
         private void fillStringCache(CTStrData cache, int numOfPoints, XDDFDataSource<?> data) {
             cache.setPtArray(null); // unset old values
-            if (cache.isSetPtCount()) {
-                cache.getPtCount().setVal(numOfPoints);
-            } else {
-                cache.addNewPtCount().setVal(numOfPoints);
-            }
-            for (int i = 0; i < numOfPoints; ++i) {
-                String value = data.getPointAt(i).toString();
-                if (value != null) {
-                    CTStrVal ctStrVal = cache.addNewPt();
-                    ctStrVal.setIdx(i);
-                    ctStrVal.setV(value);
+            if (data.getPointAt(0) != null) { // assuming no value for first is no values at all
+                if (cache.isSetPtCount()) {
+                    cache.getPtCount().setVal(numOfPoints);
+                } else {
+                    cache.addNewPtCount().setVal(numOfPoints);
+                }
+                for (int i = 0; i < numOfPoints; ++i) {
+                    String value = data.getPointAt(i).toString();
+                    if (value != null) {
+                        CTStrVal ctStrVal = cache.addNewPt();
+                        ctStrVal.setIdx(i);
+                        ctStrVal.setV(value);
+                    }
                 }
             }
         }
@@ -337,17 +373,19 @@ public abstract class XDDFChartData {
                 cache.setFormatCode(formatCode);
             }
             cache.setPtArray(null); // unset old values
-            if (cache.isSetPtCount()) {
-                cache.getPtCount().setVal(numOfPoints);
-            } else {
-                cache.addNewPtCount().setVal(numOfPoints);
-            }
-            for (int i = 0; i < numOfPoints; ++i) {
-                Object value = data.getPointAt(i);
-                if (value != null) {
-                    CTNumVal ctNumVal = cache.addNewPt();
-                    ctNumVal.setIdx(i);
-                    ctNumVal.setV(value.toString());
+            if (data.getPointAt(0) != null) { // assuming no value for first is no values at all
+                if (cache.isSetPtCount()) {
+                    cache.getPtCount().setVal(numOfPoints);
+                } else {
+                    cache.addNewPtCount().setVal(numOfPoints);
+                }
+                for (int i = 0; i < numOfPoints; ++i) {
+                    Object value = data.getPointAt(i);
+                    if (value != null) {
+                        CTNumVal ctNumVal = cache.addNewPt();
+                        ctNumVal.setIdx(i);
+                        ctNumVal.setV(value.toString());
+                    }
                 }
             }
         }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSource.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSource.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSource.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSource.java Tue May 21 23:28:15 2019
@@ -27,6 +27,11 @@ public interface XDDFDataSource<T> {
 
     T getPointAt(int index);
 
+    /**
+     * @since POI 4.0.2
+     */
+    boolean isLiteral();
+
     boolean isReference();
 
     boolean isNumeric();

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSourcesFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSourcesFactory.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSourcesFactory.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSourcesFactory.java Tue May 21 23:28:15 2019
@@ -32,7 +32,8 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrData;
 
 /**
- * Class {@code XDDFDataSourcesFactory} is a factory for {@link XDDFDataSource} instances.
+ * Class {@code XDDFDataSourcesFactory} is a factory for {@link XDDFDataSource}
+ * instances.
  */
 @Beta
 public class XDDFDataSourcesFactory {
@@ -139,6 +140,14 @@ public class XDDFDataSourcesFactory {
         };
     }
 
+    public static <T extends Number> XDDFNumericalDataSource<T> fromArray(T[] elements) {
+        return new LiteralNumericalArrayDataSource<>(elements);
+    }
+
+    public static XDDFCategoryDataSource fromArray(String[] elements) {
+        return new LiteralStringArrayDataSource(elements);
+    }
+
     public static <T extends Number> XDDFNumericalDataSource<T> fromArray(T[] elements, String dataRange) {
         return new NumericalArrayDataSource<>(elements, dataRange);
     }
@@ -260,6 +269,28 @@ public class XDDFDataSourcesFactory {
         }
     }
 
+    private static class LiteralNumericalArrayDataSource<T extends Number> extends NumericalArrayDataSource<T> {
+        public LiteralNumericalArrayDataSource(T[] elements) {
+            super(elements, null, 0);
+        }
+
+        @Override
+        public boolean isLiteral() {
+            return true;
+        }
+    }
+
+    private static class LiteralStringArrayDataSource extends StringArrayDataSource {
+        public LiteralStringArrayDataSource(String[] elements) {
+            super(elements, null, 0);
+        }
+
+        @Override
+        public boolean isLiteral() {
+            return true;
+        }
+    }
+
     private abstract static class AbstractCellRangeDataSource<T> implements XDDFDataSource<T> {
         private final XSSFSheet sheet;
         private final CellRangeAddress cellRangeAddress;

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDateAxis.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDateAxis.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDateAxis.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDateAxis.java Tue May 21 23:28:15 2019
@@ -19,6 +19,7 @@ package org.apache.poi.xddf.usermodel.ch
 
 import org.apache.poi.util.Beta;
 import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
+import org.apache.poi.xddf.usermodel.text.XDDFRunProperties;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartLines;
@@ -27,10 +28,11 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickLblPos;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickMark;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt;
-import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
 
 /**
  * Date axis type. Currently only implements the same values as
@@ -83,6 +85,20 @@ public class XDDFDateAxis extends XDDFCh
     }
 
     /**
+     * @since POI 4.0.2
+     */
+    @Override
+    public XDDFRunProperties getOrAddTextProperties() {
+        CTTextBody text;
+        if (ctDateAx.isSetTxPr()) {
+            text = ctDateAx.getTxPr();
+        } else {
+            text = ctDateAx.addNewTxPr();
+        }
+        return new XDDFRunProperties(getOrAddTextProperties(text));
+    }
+
+    /**
      * @since 4.0.1
      */
     @Override
@@ -211,6 +227,11 @@ public class XDDFDateAxis extends XDDFCh
         return ctDateAx.getMinorTickMark();
     }
 
+    @Override
+    protected CTTickLblPos getCTTickLblPos() {
+        return ctDateAx.getTickLblPos();
+    }
+
     private void initializeAxis(CTPlotArea plotArea, AxisPosition position) {
         final long id = getNextAxId(plotArea);
         ctDateAx = plotArea.addNewDateAx();
@@ -219,7 +240,7 @@ public class XDDFDateAxis extends XDDFCh
         ctDateAx.addNewScaling();
         ctDateAx.addNewCrosses();
         ctDateAx.addNewCrossAx();
-        ctDateAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
+        ctDateAx.addNewTickLblPos();
         ctDateAx.addNewDelete();
         ctDateAx.addNewMajorTickMark();
         ctDateAx.addNewMinorTickMark();
@@ -230,5 +251,6 @@ public class XDDFDateAxis extends XDDFCh
         setVisible(true);
         setMajorTickMark(AxisTickMark.CROSS);
         setMinorTickMark(AxisTickMark.NONE);
+        setTickLabelPosition(AxisTickLabelPosition.NEXT_TO);
     }
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLegendEntry.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLegendEntry.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLegendEntry.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLegendEntry.java Tue May 21 23:28:15 2019
@@ -35,6 +35,9 @@ public class XDDFLegendEntry implements
     @Internal
     protected XDDFLegendEntry(CTLegendEntry entry) {
         this.entry = entry;
+        if (entry.getIdx() == null) {
+            entry.addNewIdx().setVal(0);
+        }
     }
 
     @Internal
@@ -108,12 +111,14 @@ public class XDDFLegendEntry implements
         }
     }
 
+    @Override
     public <R> Optional<R> findDefinedParagraphProperty(
             Function<CTTextParagraphProperties, Boolean> isSet,
             Function<CTTextParagraphProperties, R> getter) {
         return Optional.empty(); // legend entry has no (indirect) paragraph properties
     }
 
+    @Override
     public <R> Optional<R> findDefinedRunProperty(
             Function<CTTextCharacterProperties, Boolean> isSet,
             Function<CTTextCharacterProperties, R> getter) {

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLine3DChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLine3DChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLine3DChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLine3DChartData.java Tue May 21 23:28:15 2019
@@ -33,8 +33,13 @@ import org.openxmlformats.schemas.drawin
 public class XDDFLine3DChartData extends XDDFChartData {
     private CTLine3DChart chart;
 
-    public XDDFLine3DChartData(CTLine3DChart chart, Map<Long, XDDFChartAxis> categories,
+    @Internal
+    protected XDDFLine3DChartData(
+            XDDFChart parent,
+            CTLine3DChart chart,
+            Map<Long, XDDFChartAxis> categories,
             Map<Long, XDDFValueAxis> values) {
+        super(parent);
         this.chart = chart;
         for (CTLineSer series : chart.getSerList()) {
             this.series.add(new Series(series, series.getCat(), series.getVal()));
@@ -254,12 +259,12 @@ public class XDDFLine3DChartData extends
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLineChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLineChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLineChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFLineChartData.java Tue May 21 23:28:15 2019
@@ -33,8 +33,13 @@ import org.openxmlformats.schemas.drawin
 public class XDDFLineChartData extends XDDFChartData {
     private CTLineChart chart;
 
-    public XDDFLineChartData(CTLineChart chart, Map<Long, XDDFChartAxis> categories,
+    @Internal
+    protected XDDFLineChartData(
+            XDDFChart parent,
+            CTLineChart chart,
+            Map<Long, XDDFChartAxis> categories,
             Map<Long, XDDFValueAxis> values) {
+        super(parent);
         this.chart = chart;
         for (CTLineSer series : chart.getSerList()) {
             this.series.add(new Series(series, series.getCat(), series.getVal()));
@@ -90,7 +95,7 @@ public class XDDFLineChartData extends X
     @Override
     public XDDFChartData.Series addSeries(XDDFDataSource<?> category,
             XDDFNumericalDataSource<? extends Number> values) {
-        final int index = this.series.size();
+        final long index = this.parent.incrementSeriesCount();
         final CTLineSer ctSer = this.chart.addNewSer();
         ctSer.addNewCat();
         ctSer.addNewVal();
@@ -234,12 +239,12 @@ public class XDDFLineChartData extends X
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFNumericalDataSource.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFNumericalDataSource.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFNumericalDataSource.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFNumericalDataSource.java Tue May 21 23:28:15 2019
@@ -26,4 +26,9 @@ public interface XDDFNumericalDataSource
     String getFormatCode();
 
     void setFormatCode(String formatCode);
+
+    @Override
+    default boolean isLiteral() {
+        return false;
+    }
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFPie3DChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFPie3DChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFPie3DChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFPie3DChartData.java Tue May 21 23:28:15 2019
@@ -30,7 +30,9 @@ import org.openxmlformats.schemas.drawin
 public class XDDFPie3DChartData extends XDDFChartData {
     private CTPie3DChart chart;
 
-    public XDDFPie3DChartData(CTPie3DChart chart) {
+    @Internal
+    protected XDDFPie3DChartData(XDDFChart parent, CTPie3DChart chart) {
+        super(parent);
         this.chart = chart;
         for (CTPieSer series : chart.getSerList()) {
             this.series.add(new Series(series, series.getCat(), series.getVal()));
@@ -164,12 +166,12 @@ public class XDDFPie3DChartData extends
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFPieChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFPieChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFPieChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFPieChartData.java Tue May 21 23:28:15 2019
@@ -30,7 +30,9 @@ import org.openxmlformats.schemas.drawin
 public class XDDFPieChartData extends XDDFChartData {
     private CTPieChart chart;
 
-    public XDDFPieChartData(CTPieChart chart) {
+    @Internal
+    protected XDDFPieChartData(XDDFChart parent, CTPieChart chart) {
+        super(parent);
         this.chart = chart;
         for (CTPieSer series : chart.getSerList()) {
             this.series.add(new Series(series, series.getCat(), series.getVal()));
@@ -86,7 +88,7 @@ public class XDDFPieChartData extends XD
     @Override
     public XDDFChartData.Series addSeries(XDDFDataSource<?> category,
             XDDFNumericalDataSource<? extends Number> values) {
-        final int index = this.series.size();
+        final long index = this.parent.incrementSeriesCount();
         final CTPieSer ctSer = this.chart.addNewSer();
         ctSer.addNewCat();
         ctSer.addNewVal();
@@ -189,12 +191,12 @@ public class XDDFPieChartData extends XD
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFRadarChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFRadarChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFRadarChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFRadarChartData.java Tue May 21 23:28:15 2019
@@ -33,8 +33,13 @@ import org.openxmlformats.schemas.drawin
 public class XDDFRadarChartData extends XDDFChartData {
     private CTRadarChart chart;
 
-    public XDDFRadarChartData(CTRadarChart chart, Map<Long, XDDFChartAxis> categories,
+    @Internal
+    protected XDDFRadarChartData(
+            XDDFChart parent,
+            CTRadarChart chart,
+            Map<Long, XDDFChartAxis> categories,
             Map<Long, XDDFValueAxis> values) {
+        super(parent);
         this.chart = chart;
         for (CTRadarSer series : chart.getSerList()) {
             this.series.add(new Series(series, series.getCat(), series.getVal()));
@@ -90,7 +95,7 @@ public class XDDFRadarChartData extends
     @Override
     public XDDFChartData.Series addSeries(XDDFDataSource<?> category,
             XDDFNumericalDataSource<? extends Number> values) {
-        final int index = this.series.size();
+        final long index = this.parent.incrementSeriesCount();
         final CTRadarSer ctSer = this.chart.addNewSer();
         ctSer.addNewCat();
         ctSer.addNewVal();
@@ -171,12 +176,12 @@ public class XDDFRadarChartData extends
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFScatterChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFScatterChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFScatterChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFScatterChartData.java Tue May 21 23:28:15 2019
@@ -34,8 +34,13 @@ import org.openxmlformats.schemas.drawin
 public class XDDFScatterChartData extends XDDFChartData {
     private CTScatterChart chart;
 
-    public XDDFScatterChartData(CTScatterChart chart, Map<Long, XDDFChartAxis> categories,
+    @Internal
+    protected XDDFScatterChartData(
+            XDDFChart parent,
+            CTScatterChart chart,
+            Map<Long, XDDFChartAxis> categories,
             Map<Long, XDDFValueAxis> values) {
+        super(parent);
         this.chart = chart;
         for (CTScatterSer series : chart.getSerList()) {
             this.series.add(new Series(series, series.getXVal(), series.getYVal()));
@@ -96,13 +101,14 @@ public class XDDFScatterChartData extend
     @Override
     public XDDFChartData.Series addSeries(XDDFDataSource<?> category,
             XDDFNumericalDataSource<? extends Number> values) {
-        final int index = this.series.size();
+        final long index = this.parent.incrementSeriesCount();
         final CTScatterSer ctSer = this.chart.addNewSer();
         ctSer.addNewXVal();
         ctSer.addNewYVal();
         ctSer.addNewIdx().setVal(index);
         ctSer.addNewOrder().setVal(index);
         final Series added = new Series(ctSer, category, values);
+        added.setMarkerStyle(MarkerStyle.NONE);
         this.series.add(added);
         return added;
     }
@@ -243,12 +249,12 @@ public class XDDFScatterChartData extend
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSeriesAxis.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSeriesAxis.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSeriesAxis.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSeriesAxis.java Tue May 21 23:28:15 2019
@@ -19,6 +19,7 @@ package org.apache.poi.xddf.usermodel.ch
 
 import org.apache.poi.util.Beta;
 import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
+import org.apache.poi.xddf.usermodel.text.XDDFRunProperties;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartLines;
@@ -27,10 +28,11 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerAx;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickLblPos;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickMark;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt;
-import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
 
 @Beta
 public class XDDFSeriesAxis extends XDDFChartAxis {
@@ -75,11 +77,24 @@ public class XDDFSeriesAxis extends XDDF
         } else {
             properties = ctSerAx.addNewSpPr();
         }
-
         return new XDDFShapeProperties(properties);
     }
 
     /**
+     * @since POI 4.0.2
+     */
+    @Override
+    public XDDFRunProperties getOrAddTextProperties() {
+        CTTextBody text;
+        if (ctSerAx.isSetTxPr()) {
+            text = ctSerAx.getTxPr();
+        } else {
+            text = ctSerAx.addNewTxPr();
+        }
+        return new XDDFRunProperties(getOrAddTextProperties(text));
+    }
+
+    /**
      * @since 4.0.1
      */
     @Override
@@ -180,6 +195,11 @@ public class XDDFSeriesAxis extends XDDF
         return ctSerAx.getMinorTickMark();
     }
 
+    @Override
+    protected CTTickLblPos getCTTickLblPos() {
+        return ctSerAx.getTickLblPos();
+    }
+
     private void initializeAxis(CTPlotArea plotArea, AxisPosition position) {
         final long id = getNextAxId(plotArea);
         ctSerAx = plotArea.addNewSerAx();
@@ -188,7 +208,7 @@ public class XDDFSeriesAxis extends XDDF
         ctSerAx.addNewScaling();
         ctSerAx.addNewCrosses();
         ctSerAx.addNewCrossAx();
-        ctSerAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
+        ctSerAx.addNewTickLblPos();
         ctSerAx.addNewDelete();
         ctSerAx.addNewMajorTickMark();
         ctSerAx.addNewMinorTickMark();
@@ -199,5 +219,6 @@ public class XDDFSeriesAxis extends XDDF
         setVisible(true);
         setMajorTickMark(AxisTickMark.CROSS);
         setMinorTickMark(AxisTickMark.NONE);
+        setTickLabelPosition(AxisTickLabelPosition.NEXT_TO);
     }
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSurface3DChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSurface3DChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSurface3DChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSurface3DChartData.java Tue May 21 23:28:15 2019
@@ -32,8 +32,13 @@ import org.openxmlformats.schemas.drawin
 public class XDDFSurface3DChartData extends XDDFChartData {
     private CTSurface3DChart chart;
 
-    public XDDFSurface3DChartData(CTSurface3DChart chart, Map<Long, XDDFChartAxis> categories,
+    @Internal
+    protected XDDFSurface3DChartData(
+            XDDFChart parent,
+            CTSurface3DChart chart,
+            Map<Long, XDDFChartAxis> categories,
             Map<Long, XDDFValueAxis> values) {
+        super(parent);
         this.chart = chart;
         for (CTSurfaceSer series : chart.getSerList()) {
             this.series.add(new Series(series, series.getCat(), series.getVal()));
@@ -173,12 +178,12 @@ public class XDDFSurface3DChartData exte
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSurfaceChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSurfaceChartData.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSurfaceChartData.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFSurfaceChartData.java Tue May 21 23:28:15 2019
@@ -31,8 +31,14 @@ import org.openxmlformats.schemas.drawin
 @Beta
 public class XDDFSurfaceChartData extends XDDFChartData {
     private CTSurfaceChart chart;
-    public XDDFSurfaceChartData(CTSurfaceChart chart, Map<Long, XDDFChartAxis> categories,
+
+    @Internal
+    protected XDDFSurfaceChartData(
+            XDDFChart parent,
+            CTSurfaceChart chart,
+            Map<Long, XDDFChartAxis> categories,
             Map<Long, XDDFValueAxis> values) {
+        super(parent);
         this.chart = chart;
         for (CTSurfaceSer series : chart.getSerList()) {
             this.series.add(new Series(series, series.getCat(), series.getVal()));
@@ -172,12 +178,12 @@ public class XDDFSurfaceChartData extend
         }
 
         @Override
-        public void setIndex(long val) {
+        protected void setIndex(long val) {
             series.getIdx().setVal(val);
         }
 
         @Override
-        public void setOrder(long val) {
+        protected void setOrder(long val) {
             series.getOrder().setVal(val);
         }
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFValueAxis.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFValueAxis.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFValueAxis.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFValueAxis.java Tue May 21 23:28:15 2019
@@ -19,6 +19,7 @@ package org.apache.poi.xddf.usermodel.ch
 
 import org.apache.poi.util.Beta;
 import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
+import org.apache.poi.xddf.usermodel.text.XDDFRunProperties;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartLines;
@@ -26,11 +27,12 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickLblPos;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTTickMark;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTUnsignedInt;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
-import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
 
 @Beta
 public class XDDFValueAxis extends XDDFChartAxis {
@@ -79,6 +81,20 @@ public class XDDFValueAxis extends XDDFC
     }
 
     /**
+     * @since POI 4.0.2
+     */
+    @Override
+    public XDDFRunProperties getOrAddTextProperties() {
+        CTTextBody text;
+        if (ctValAx.isSetTxPr()) {
+            text = ctValAx.getTxPr();
+        } else {
+            text = ctValAx.addNewTxPr();
+        }
+        return new XDDFRunProperties(getOrAddTextProperties(text));
+    }
+
+    /**
      * @since 4.0.1
      */
     @Override
@@ -207,6 +223,11 @@ public class XDDFValueAxis extends XDDFC
         return ctValAx.getMinorTickMark();
     }
 
+    @Override
+    protected CTTickLblPos getCTTickLblPos() {
+        return ctValAx.getTickLblPos();
+    }
+
     public AxisCrossBetween getCrossBetween() {
         return AxisCrossBetween.valueOf(ctValAx.getCrossBetween().getVal());
     }
@@ -224,7 +245,7 @@ public class XDDFValueAxis extends XDDFC
         ctValAx.addNewCrossBetween();
         ctValAx.addNewCrosses();
         ctValAx.addNewCrossAx();
-        ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
+        ctValAx.addNewTickLblPos();
         ctValAx.addNewDelete();
         ctValAx.addNewMajorTickMark();
         ctValAx.addNewMinorTickMark();
@@ -236,5 +257,6 @@ public class XDDFValueAxis extends XDDFC
         setVisible(true);
         setMajorTickMark(AxisTickMark.CROSS);
         setMinorTickMark(AxisTickMark.NONE);
+        setTickLabelPosition(AxisTickLabelPosition.NEXT_TO);
     }
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFRunProperties.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFRunProperties.java?rev=1859676&r1=1859675&r2=1859676&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFRunProperties.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFRunProperties.java Tue May 21 23:28:15 2019
@@ -45,7 +45,7 @@ public class XDDFRunProperties {
     }
 
     @Internal
-    protected XDDFRunProperties(CTTextCharacterProperties properties) {
+    public XDDFRunProperties(CTTextCharacterProperties properties) {
         this.props = properties;
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org