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 1d92b6380..a26ca9c5f 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -17,6 +17,7 @@ package org.apache.poi.xssf.usermodel; +import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.LinkedList; @@ -31,12 +32,15 @@ import org.apache.poi.ss.usermodel.Name; import org.apache.poi.ss.usermodel.Palette; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; +import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; import org.openxml4j.exceptions.InvalidFormatException; +import org.openxml4j.exceptions.OpenXML4JException; import org.openxml4j.opc.Package; import org.openxml4j.opc.PackagePart; import org.openxml4j.opc.PackagePartName; +import org.openxml4j.opc.PackageRelationship; import org.openxml4j.opc.PackageRelationshipTypes; import org.openxml4j.opc.PackagingURIHelper; import org.openxml4j.opc.TargetMode; @@ -45,6 +49,7 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBookViews; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument; public class XSSFWorkbook implements Workbook { @@ -52,6 +57,9 @@ public class XSSFWorkbook implements Workbook { private CTWorkbook workbook; private List sheets = new LinkedList(); + + /** The OPC Package */ + private Package pkg; public XSSFWorkbook() { this.workbook = CTWorkbook.Factory.newInstance(); @@ -61,6 +69,26 @@ public class XSSFWorkbook implements Workbook { this.workbook.addNewSheets(); } + public XSSFWorkbook(String path) throws IOException { + try { + this.pkg = Package.open(path); + PackageRelationship coreDocRelationship = this.pkg.getRelationshipsByType( + PackageRelationshipTypes.CORE_DOCUMENT).getRelationship(0); + + // Get core part + PackagePart corePart = this.pkg.getPart(coreDocRelationship); + WorkbookDocument doc = WorkbookDocument.Factory.parse(corePart.getInputStream()); + this.workbook = doc.getWorkbook(); + + } catch (InvalidFormatException e) { + throw new IOException(e.toString()); + } catch (OpenXML4JException e) { + throw new IOException(e.toString()); + } catch (XmlException e) { + throw new IOException(e.toString()); + } + } + protected CTWorkbook getWorkbook() { return this.workbook; } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/io/TestLoadSaveXSSF.java b/src/ooxml/testcases/org/apache/poi/xssf/io/TestLoadSaveXSSF.java new file mode 100644 index 000000000..18d0034f8 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/io/TestLoadSaveXSSF.java @@ -0,0 +1,36 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.xssf.io; + +import java.net.URL; + +import junit.framework.TestCase; + +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + + +public class TestLoadSaveXSSF extends TestCase { + + public void testLoadSample() throws Exception { + URL url = this.getClass().getResource("sample.xlsx"); + XSSFWorkbook workbook = new XSSFWorkbook(url.getFile()); + assertEquals(3, workbook.getNumberOfSheets()); + assertEquals("Sheet1", workbook.getSheetName(0)); + } + +} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/io/sample.xlsx b/src/ooxml/testcases/org/apache/poi/xssf/io/sample.xlsx new file mode 100644 index 000000000..a275cf417 Binary files /dev/null and b/src/ooxml/testcases/org/apache/poi/xssf/io/sample.xlsx differ