diff --git a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/OPCPackage.java b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/OPCPackage.java index 1146711705..35f3c10c01 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/OPCPackage.java +++ b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/OPCPackage.java @@ -940,7 +940,7 @@ public abstract class OPCPackage implements RelationshipSource, Closeable { throw new IllegalArgumentException("part"); } - if (partList.containsKey(part._partName)) { + if (hasPackagePart(part)) { if (!partList.get(part._partName).isDeleted()) { throw new InvalidOperationException( "A part with the name '" @@ -958,6 +958,10 @@ public abstract class OPCPackage implements RelationshipSource, Closeable { return part; } + protected boolean hasPackagePart(PackagePart part) { + return partList.containsKey(part._partName); + } + /** * Remove the specified part in this package. If this part is relationship * part, then delete all relationships in the source part. diff --git a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/ZipPackage.java b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/ZipPackage.java index 3567e66074..dc176b441b 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/ZipPackage.java +++ b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/ZipPackage.java @@ -542,7 +542,9 @@ public final class ZipPackage extends OPCPackage { // Ensure that core properties are added if missing getPackageProperties(); // Add core properties to part list ... - addPackagePart(this.packageProperties); + if (!hasPackagePart(this.packageProperties)) { + addPackagePart(this.packageProperties); + } // ... and to add its relationship ... this.relationships.addRelationship(this.packageProperties .getPartName().getURI(), TargetMode.INTERNAL, 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 d8d36726d0..fe3ac973cd 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 @@ -3864,6 +3864,23 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { } } + @Test + void testBug66675() throws Exception { + try (XSSFWorkbook wb = openSampleWorkbook("bug66675.xlsx")) { + POIXMLProperties.CoreProperties coreProperties = wb.getProperties().getCoreProperties(); + assertNotNull(coreProperties); + wb.removeSheetAt(0); + try (UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get()) { + wb.write(bos); + try (XSSFWorkbook wb2 = new XSSFWorkbook(bos.toInputStream())) { + XSSFSheet sheet = wb2.getSheetAt(0); + assertNotNull(sheet); + assertNotNull(wb2.getProperties().getCoreProperties()); + } + } + } + } + private static void readByCommonsCompress(File temp_excel_poi) throws IOException { /* read by commons-compress*/ try (ZipFile zipFile = new ZipFile(temp_excel_poi)) { diff --git a/test-data/spreadsheet/bug66675.xlsx b/test-data/spreadsheet/bug66675.xlsx new file mode 100644 index 0000000000..61f0dca4e6 Binary files /dev/null and b/test-data/spreadsheet/bug66675.xlsx differ