From 95712b5661f305ba91783d0d2d36fcd7caa6ba65 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Wed, 14 May 2014 21:14:16 +0000 Subject: [PATCH] Bug 56468 - Writing a workbook more than once corrupts the file git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1594721 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/poi/POIXMLProperties.java | 3 +++ .../apache/poi/openxml4j/opc/OPCPackage.java | 5 +++- .../apache/poi/openxml4j/opc/ZipPackage.java | 6 ++--- .../poi/xssf/usermodel/XSSFWorkbook.java | 23 +++++++++++++------ .../poi/xssf/usermodel/TestXSSFBugs.java | 22 ++++++++++++++++++ 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/ooxml/java/org/apache/poi/POIXMLProperties.java b/src/ooxml/java/org/apache/poi/POIXMLProperties.java index 307b3d8e58..d7a1719123 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 5cc894f7de..e210be6f67 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 9ac8fd17fa..a352a8d1f6 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 2955300e42..34d8eada76 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 83623a780d..f0266c9f69 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)); + } } -- 2.39.5