From: Dominik Stadler Date: Mon, 26 Oct 2015 07:54:06 +0000 (+0000) Subject: Bug 56957: Avoid error if Workbook with empty SharedStringTable is written X-Git-Tag: REL_3_14_BETA1~221 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=bcaab496b69443b0904e45c1ae168db41c2ea8eb;p=poi.git Bug 56957: Avoid error if Workbook with empty SharedStringTable is written git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1710521 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java index 296f7a6c67..8860ae37e5 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java @@ -38,6 +38,7 @@ import org.apache.poi.openxml4j.opc.internal.ZipHelper; import org.apache.poi.util.DocumentHelper; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; +import org.apache.poi.xssf.usermodel.XSSFRelation; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -63,6 +64,12 @@ public final class ZipPartMarshaller implements PartMarshaller { // Normally should happen only in developement phase, so just throw // exception } + + // check if there is anything to save for some parts. We don't do this for all parts as some code + // might depend on empty parts being saved, e.g. some unit tests verify this currently. + if(part.getSize() == 0 && part.getPartName().getName().equals(XSSFRelation.SHARED_STRINGS.getDefaultFileName())) { + return true; + } ZipOutputStream zos = (ZipOutputStream) os; ZipEntry partEntry = new ZipEntry(ZipHelper diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java index f5fdd4363d..199a3fe307 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java @@ -40,10 +40,12 @@ import org.apache.poi.POIXMLProperties; import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.openxml4j.opc.ContentTypes; import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.openxml4j.opc.PackageAccess; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagePartName; import org.apache.poi.openxml4j.opc.PackageRelationshipCollection; import org.apache.poi.openxml4j.opc.PackagingURIHelper; +import org.apache.poi.openxml4j.opc.internal.FileHelper; import org.apache.poi.openxml4j.opc.internal.MemoryPackagePart; import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart; import org.apache.poi.ss.SpreadsheetVersion; @@ -1019,5 +1021,42 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { finally { IOUtils.closeQuietly(wb); } + } + + @Test + public void testBug56957CloseWorkbook() throws Exception { + File file = TempFile.createTempFile("TestBug56957_", ".xlsx"); + + try { + // as the file is written to, we make a copy before actually working on it + FileHelper.copyFile(new File("test-data/spreadsheet/56957.xlsx"), file); + + assertTrue(file.exists()); + + // read-only mode works! + Workbook workbook = WorkbookFactory.create(OPCPackage.open(file, PackageAccess.READ)); + System.out.println(workbook.getSheetAt(0).getRow(0).getCell(0, Row.CREATE_NULL_AS_BLANK).getDateCellValue().toString()); + workbook.close(); + workbook = null; + + workbook = WorkbookFactory.create(OPCPackage.open(file, PackageAccess.READ)); + System.out.println(workbook.getSheetAt(0).getRow(0).getCell(0, Row.CREATE_NULL_AS_BLANK).getDateCellValue().toString()); + workbook.close(); + workbook = null; + + // now check read/write mode + workbook = WorkbookFactory.create(OPCPackage.open(file, PackageAccess.READ_WRITE)); + System.out.println(workbook.getSheetAt(0).getRow(0).getCell(0, Row.CREATE_NULL_AS_BLANK).getDateCellValue().toString()); + workbook.close(); + workbook = null; + + workbook = WorkbookFactory.create(OPCPackage.open(file, PackageAccess.READ_WRITE)); + System.out.println(workbook.getSheetAt(0).getRow(0).getCell(0, Row.CREATE_NULL_AS_BLANK).getDateCellValue().toString()); + workbook.close(); + workbook = null; + } finally { + assertTrue(file.exists()); + assertTrue(file.delete()); + } } } diff --git a/test-data/spreadsheet/56957.xlsx b/test-data/spreadsheet/56957.xlsx new file mode 100644 index 0000000000..b58aa62dbb Binary files /dev/null and b/test-data/spreadsheet/56957.xlsx differ