]> source.dussan.org Git - poi.git/commitdiff
Bug 65016 - Creating a chart throws exception
authorAlain Béarez <abearez@apache.org>
Tue, 19 Jan 2021 21:33:38 +0000 (21:33 +0000)
committerAlain Béarez <abearez@apache.org>
Tue, 19 Jan 2021 21:33:38 +0000 (21:33 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1885700 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSource.java
src/ooxml/testcases/org/apache/poi/xddf/usermodel/chart/TestXDDFChart.java
test-data/spreadsheet/65016.xlsx [new file with mode: 0644]

index e6f085e80797e41da8c23a0c532845e3248b150e..439d0a325ce7b580d30c78c70eb444b25d1b5fc3 100644 (file)
@@ -80,7 +80,9 @@ public interface XDDFDataSource<T> {
             }
         }
         if (effectiveNumOfPoints == 0) {
-            cache.unsetPtCount();
+            if (cache.isSetPtCount()) {
+                cache.unsetPtCount();
+            }
         } else {
             if (cache.isSetPtCount()) {
                 cache.getPtCount().setVal(numOfPoints);
index 4ace282749d1e478736bb166877f878fd794052f..66196d375bb0a9340b896a107376a709cb9d1139 100644 (file)
@@ -23,9 +23,17 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import org.apache.poi.ooxml.POIXMLFactory;
 import org.apache.poi.ooxml.POIXMLRelation;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.XSSFTestDataSamples;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.junit.jupiter.api.Test;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
 
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
 class TestXDDFChart {
     @Test
     void testConstruct() {
@@ -48,6 +56,39 @@ class TestXDDFChart {
         assertEquals("rid2", ctChartSpace.getExternalData().getId());
     }
 
+    @Test
+    public void test65016() throws IOException {
+        try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("65016.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);
+
+            XDDFLineChartData data = (XDDFLineChartData) 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));
+
+            XDDFLineChartData.Series series = (XDDFLineChartData.Series) data.addSeries(xs, ys1);
+            assertEquals(series.categoryData.getPointCount(), xs.getPointCount());
+
+            chart.plot(data);
+
+            try (OutputStream out = new FileOutputStream("/tmp/chart20201220.xlsx")) {
+                wb.write(out);
+            }
+        }
+    }
+
     private XDDFChart newXDDFChart() {
         XDDFChart xddfChart = new XDDFChart() {
             @Override
@@ -67,4 +108,4 @@ class TestXDDFChart {
         };
         return xddfChart;
     }
-}
\ No newline at end of file
+}
diff --git a/test-data/spreadsheet/65016.xlsx b/test-data/spreadsheet/65016.xlsx
new file mode 100644 (file)
index 0000000..b2aa57f
Binary files /dev/null and b/test-data/spreadsheet/65016.xlsx differ