diff --git a/src/ooxml/java/org/apache/poi/POIXMLProperties.java b/src/ooxml/java/org/apache/poi/POIXMLProperties.java index 307b3d8e5..d7a171912 100644 --- a/src/ooxml/java/org/apache/poi/POIXMLProperties.java +++ b/src/ooxml/java/org/apache/poi/POIXMLProperties.java @@ -148,6 +148,9 @@ public class POIXMLProperties { xmlOptions.setSaveSuggestedPrefixes(map); OutputStream out = extPart.getOutputStream(); + if (extPart.getSize() > 0) { + extPart.clear(); + } ext.props.save(out, xmlOptions); out.close(); } diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java index 5cc894f7d..e210be6f6 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java @@ -599,7 +599,10 @@ public abstract class OPCPackage implements RelationshipSource, Closeable { throw new IllegalArgumentException("relationshipType"); ArrayList retArr = new ArrayList(); for (PackageRelationship rel : getRelationshipsByType(relationshipType)) { - retArr.add(getPart(rel)); + PackagePart part = getPart(rel); + if (part != null) { + retArr.add(part); + } } return retArr; } diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java index 9ac8fd17f..a352a8d1f 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java @@ -37,7 +37,6 @@ import org.apache.poi.openxml4j.opc.internal.MemoryPackagePart; import org.apache.poi.openxml4j.opc.internal.PartMarshaller; import org.apache.poi.openxml4j.opc.internal.ZipContentTypeManager; import org.apache.poi.openxml4j.opc.internal.ZipHelper; -import org.apache.poi.openxml4j.opc.internal.marshallers.ZipPackagePropertiesMarshaller; import org.apache.poi.openxml4j.opc.internal.marshallers.ZipPartMarshaller; import org.apache.poi.openxml4j.util.ZipEntrySource; import org.apache.poi.openxml4j.util.ZipFileZipEntrySource; @@ -444,9 +443,8 @@ public final class ZipPackage extends Package { this.getPartsByRelationshipType(PackageRelationshipTypes.CORE_PROPERTIES_ECMA376).size() == 0 ) { logger.log(POILogger.DEBUG,"Save core properties part"); - // We have to save the core properties part ... - new ZipPackagePropertiesMarshaller().marshall( - this.packageProperties, zos); + // Add core properties to part list ... + addPackagePart(this.packageProperties); // ... and to add its relationship ... this.relationships.addRelationship(this.packageProperties .getPartName().getURI(), TargetMode.INTERNAL, diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index 2955300e4..34d8eada7 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -321,13 +321,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable(); - if(workbook.isSetDefinedNames()) { - for(CTDefinedName ctName : workbook.getDefinedNames().getDefinedNameArray()) { - namedRanges.add(new XSSFName(ctName, this)); - } - } - + reprocessNamedRanges(); } catch (XmlException e) { throw new POIXMLException(e); } @@ -1307,13 +1301,28 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable(); + if(workbook.isSetDefinedNames()) { + for(CTDefinedName ctName : workbook.getDefinedNames().getDefinedNameList()) { + namedRanges.add(new XSSFName(ctName, this)); + } + } + } private void saveCalculationChain(){ if(calcChain != null){ diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index 83623a780..f0266c9f6 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -17,10 +17,12 @@ package org.apache.poi.xssf.usermodel; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -60,6 +62,7 @@ import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.AreaReference; +import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellReference; import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.xssf.XSSFTestDataSamples; @@ -1464,4 +1467,23 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { double rounded = cv.getNumberValue(); assertEquals(0.1, rounded, 0.0); } + + @Test + public void bug56468() throws Exception { + XSSFWorkbook wb = new XSSFWorkbook(); + XSSFSheet sheet = wb.createSheet(); + XSSFRow row = sheet.createRow(0); + XSSFCell cell = row.createCell(0); + cell.setCellValue("Hi"); + sheet.setRepeatingRows(new CellRangeAddress(0, 0, 0, 0)); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(8096); + wb.write(bos); + byte firstSave[] = bos.toByteArray(); + bos.reset(); + wb.write(bos); + byte secondSave[] = bos.toByteArray(); + + assertThat(firstSave, equalTo(secondSave)); + } }