From bcaab496b69443b0904e45c1ae168db41c2ea8eb Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Mon, 26 Oct 2015 07:54:06 +0000 Subject: [PATCH] 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 --- .../marshallers/ZipPartMarshaller.java | 7 ++++ .../poi/xssf/usermodel/TestXSSFWorkbook.java | 39 ++++++++++++++++++ test-data/spreadsheet/56957.xlsx | Bin 0 -> 7183 bytes 3 files changed, 46 insertions(+) create mode 100644 test-data/spreadsheet/56957.xlsx 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 0000000000000000000000000000000000000000..b58aa62dbb29c3e2a478d75c12e097fe7cb7b696 GIT binary patch literal 7183 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 Hm%si6qX3Pk literal 0 HcmV?d00001