From 3184a18b40caad5b63630a4379de34d50268f3c5 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 15 Aug 2022 19:20:13 +0000 Subject: [PATCH] [bug-66216] fix issue where pivotTable.getPivotCacheDefinition() returns null git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1903442 13f79535-47bb-0310-9956-ffa450edef68 --- .../usermodel/XSSFPivotCacheDefinition.java | 2 +- .../poi/xssf/usermodel/XSSFPivotTable.java | 12 +++++++++++ .../poi/xssf/usermodel/TestXSSFBugs.java | 19 ++++++++++++++++++ .../spreadsheet/ExcelPivotTableSample.xlsx | Bin 0 -> 19460 bytes 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 test-data/spreadsheet/ExcelPivotTableSample.xlsx 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 0000000000000000000000000000000000000000..bab0b0b7b210d8beec2d656813bccd6b04429d17 GIT binary patch literal 19460 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