Bug 65016 - Creating a chart throws IndexOutOfBoundsException
Summary: Creating a chart throws IndexOutOfBoundsException
Status: RESOLVED FIXED
Alias: None
Product: POI
Classification: Unclassified
Component: XDDF (show other bugs)
Version: unspecified
Hardware: PC Linux
: P2 major (vote)
Target Milestone: ---
Assignee: POI Developers List
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-12-20 22:03 UTC by Dominik Stadler
Modified: 2021-01-19 21:35 UTC (History)
0 users



Attachments
List of dates and values for a chart (300.61 KB, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)
2020-12-20 22:03 UTC, Dominik Stadler
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Dominik Stadler 2020-12-20 22:03:58 UTC
Created attachment 37636 [details]
List of dates and values for a chart

The following unit-test combined with the attached sample document throws an exception.

I tried to "fix" it, but couldn't, if this is some incorrect usage of the new XDDFChart functionality, we should at least try to validate the inputs and provide a better error message.


java.lang.IndexOutOfBoundsException
	at org.apache.xmlbeans.impl.store.Xobj.removeElement(Xobj.java:2099)
	at org.apache.xmlbeans.impl.store.Xobj.remove_element(Xobj.java:2130)
	at org.openxmlformats.schemas.drawingml.x2006.chart.impl.CTNumDataImpl.unsetPtCount(CTNumDataImpl.java:168)
	at org.apache.poi.xddf.usermodel.chart.XDDFDataSource.fillNumericalCache(XDDFDataSource.java:84)
	at org.apache.poi.xddf.usermodel.chart.XDDFChartData$Series.plot(XDDFChartData.java:214)
	at org.apache.poi.xddf.usermodel.chart.XDDFChart.plot(XDDFChart.java:418)
	at org.apache.poi.xddf.usermodel.chart.TestXDDFChart.testException(TestXDDFChart.java:102)



    @Test
    public void testException() throws IOException {
        try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("chart20201220.xlsx")) {
            XSSFSheet splitSheet = wb.getSheet("Splits");

            XDDFChart chart = newXDDFChart();
            XDDFChartLegend legend = chart.getOrAddLegend();
            legend.setPosition(LegendPosition.BOTTOM);

            // Use a category axis for the bottom axis.
            XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
            XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
            leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);

            XDDFChartData data = chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);

            // starting row 1 to include description
            XDDFNumericalDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange(splitSheet,
                    new CellRangeAddress(2, 100, 0, 0));
            XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(splitSheet,
                    new CellRangeAddress(2, 100, 1, 1));

            data.addSeries(xs, ys1);

            chart.plot(data);

            try (OutputStream out = new FileOutputStream("/tmp/chart20201220.xlsx")) {
                wb.write(out);
            }
        }
    }
Comment 1 Dominik Stadler 2020-12-20 22:11:29 UTC
This is on the latest trunk, btw.
Comment 2 Alain Fagot Bearez 2021-01-19 03:57:42 UTC
Following pull request should fix the exception which was thrown when trying to unset an underlying XML element which was not set.

https://github.com/apache/poi/pull/220

Could you check if this also fixes your use case?
Comment 3 Dominik Stadler 2021-01-19 05:45:44 UTC
This seems to fix the issue for me, Thanks!
Comment 4 Alain Fagot Bearez 2021-01-19 21:35:36 UTC
fixed by r1885700