diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java index 4e3c8607e7..e5709c01e9 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java @@ -48,7 +48,7 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{ private CTPivotCacheDefinition ctPivotCacheDefinition; @Beta - public XSSFPivotCacheDefinition(){ + public XSSFPivotCacheDefinition() { super(); ctPivotCacheDefinition = CTPivotCacheDefinition.Factory.newInstance(); createDefaultValues(); diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java index 6ca78c88e2..506f3bc201 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java @@ -87,11 +87,20 @@ public class XSSFPivotTable extends POIXMLDocumentPart { //Removing root element options.setLoadReplaceDocumentElement(null); pivotTableDefinition = CTPivotTableDefinition.Factory.parse(is, options); + pivotCacheDefinition = null; } catch (XmlException e) { throw new IOException(e.getLocalizedMessage()); } } + private void lazyInitXSSFPivotCacheDefinition() { + for (POIXMLDocumentPart documentPart : getRelations()) { + if (documentPart instanceof XSSFPivotCacheDefinition) { + pivotCacheDefinition = (XSSFPivotCacheDefinition) documentPart; + } + } + } + @Beta public void setPivotCache(XSSFPivotCache pivotCache) { this.pivotCache = pivotCache; @@ -126,6 +135,9 @@ public class XSSFPivotTable extends POIXMLDocumentPart { @Beta public XSSFPivotCacheDefinition getPivotCacheDefinition() { + if (pivotCacheDefinition == null) { + lazyInitXSSFPivotCacheDefinition(); + } return pivotCacheDefinition; } diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index 80a7a140d5..4f12364294 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -3705,4 +3705,23 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { assertEquals(ErrorEval.VALUE_INVALID.getErrorCode(), cv1.getErrorValue()); } } + + @Test + void testBug66216() throws IOException { + File file = XSSFTestDataSamples.getSampleFile("ExcelPivotTableSample.xlsx"); + try ( + FileInputStream fis = new FileInputStream(file); + XSSFWorkbook workbook = new XSSFWorkbook(fis) + ) { + for (XSSFPivotTable pivotTable : workbook.getPivotTables()) { + assertNotNull(pivotTable.getCTPivotTableDefinition()); + assertNotNull(pivotTable.getPivotCacheDefinition()); + assertEquals(1, pivotTable.getRelations().size()); + assertInstanceOf(XSSFPivotCacheDefinition.class, pivotTable.getRelations().get(0)); + assertEquals("rId1", pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getId()); + assertEquals(3, + pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getRecordCount()); + } + } + } } \ No newline at end of file diff --git a/test-data/spreadsheet/ExcelPivotTableSample.xlsx b/test-data/spreadsheet/ExcelPivotTableSample.xlsx new file mode 100644 index 0000000000..bab0b0b7b2 Binary files /dev/null and b/test-data/spreadsheet/ExcelPivotTableSample.xlsx differ