mirror of https://github.com/apache/poi.git
More shuffling of things out of src/scratchpad/ooxml-*
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@635021 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4eb4e8eeef
commit
2cc22cb45b
|
@ -17,7 +17,11 @@
|
|||
package org.apache.poi;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.PushbackInputStream;
|
||||
|
||||
import org.apache.poi.poifs.common.POIFSConstants;
|
||||
import org.apache.poi.util.IOUtils;
|
||||
import org.openxml4j.exceptions.InvalidFormatException;
|
||||
import org.openxml4j.exceptions.OpenXML4JException;
|
||||
import org.openxml4j.opc.Package;
|
||||
|
|
|
@ -14,16 +14,13 @@
|
|||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
package org.apache.poi.hssf.extractor;
|
||||
package org.apache.poi.xssf.extractor;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.poi.POIXMLTextExtractor;
|
||||
import org.apache.poi.hssf.HSSFXML;
|
||||
import org.apache.poi.hssf.usermodel.HSSFXMLCell;
|
||||
import org.apache.poi.hssf.usermodel.HSSFXMLWorkbook;
|
||||
import org.apache.poi.hxf.HXFDocument;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.apache.xmlbeans.XmlException;
|
||||
import org.openxml4j.exceptions.OpenXML4JException;
|
||||
import org.openxml4j.opc.Package;
|
||||
|
@ -35,17 +32,15 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
|
|||
/**
|
||||
* Helper class to extract text from an OOXML Excel file
|
||||
*/
|
||||
public class HXFExcelExtractor extends POIXMLTextExtractor {
|
||||
private HSSFXMLWorkbook workbook;
|
||||
public class XSSFExcelExtractor extends POIXMLTextExtractor {
|
||||
private XSSFWorkbook workbook;
|
||||
private boolean includeSheetNames = true;
|
||||
private boolean formulasNotResults = false;
|
||||
|
||||
public HXFExcelExtractor(Package container) throws XmlException, OpenXML4JException, IOException {
|
||||
this(new HSSFXMLWorkbook(
|
||||
new HSSFXML(container)
|
||||
));
|
||||
public XSSFExcelExtractor(Package container) throws XmlException, OpenXML4JException, IOException {
|
||||
this(new XSSFWorkbook(container));
|
||||
}
|
||||
public HXFExcelExtractor(HSSFXMLWorkbook workbook) {
|
||||
public XSSFExcelExtractor(XSSFWorkbook workbook) {
|
||||
super(workbook);
|
||||
this.workbook = workbook;
|
||||
}
|
|
@ -1,104 +0,0 @@
|
|||
/* ====================================================================
|
||||
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.hssf;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.poi.hssf.model.SharedStringsTable;
|
||||
import org.apache.poi.hxf.HXFDocument;
|
||||
import org.apache.xmlbeans.XmlException;
|
||||
import org.openxml4j.exceptions.OpenXML4JException;
|
||||
import org.openxml4j.opc.Package;
|
||||
import org.openxml4j.opc.PackagePart;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheets;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument;
|
||||
|
||||
/**
|
||||
* Experimental class to do low level processing
|
||||
* of xlsx files.
|
||||
*
|
||||
* If you are using these low level classes, then you
|
||||
* will almost certainly need to refer to the OOXML
|
||||
* specifications from
|
||||
* http://www.ecma-international.org/publications/standards/Ecma-376.htm
|
||||
*
|
||||
* WARNING - APIs expected to change rapidly
|
||||
*/
|
||||
public class HSSFXML extends HXFDocument {
|
||||
public static final String MAIN_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
|
||||
public static final String SHEET_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml";
|
||||
public static final String SHARED_STRINGS_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml";
|
||||
public static final String SHARED_STRINGS_RELATION_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
|
||||
|
||||
private WorkbookDocument workbookDoc;
|
||||
private SharedStringsTable sharedStrings;
|
||||
|
||||
public HSSFXML(Package container) throws OpenXML4JException, IOException, XmlException {
|
||||
super(container, MAIN_CONTENT_TYPE);
|
||||
|
||||
workbookDoc =
|
||||
WorkbookDocument.Factory.parse(basePart.getInputStream());
|
||||
|
||||
PackagePart ssPart = getSinglePartByRelationType(SHARED_STRINGS_RELATION_TYPE, basePart);
|
||||
if (ssPart != null) {
|
||||
sharedStrings = new SharedStringsTable(ssPart);
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the low level workbook base object
|
||||
*/
|
||||
public CTWorkbook getWorkbook() {
|
||||
return workbookDoc.getWorkbook();
|
||||
}
|
||||
/**
|
||||
* Returns the references from the workbook to its
|
||||
* sheets.
|
||||
* You'll need these to figure out the sheet ordering,
|
||||
* and to get at the actual sheets themselves
|
||||
*/
|
||||
public CTSheets getSheetReferences() {
|
||||
return getWorkbook().getSheets();
|
||||
}
|
||||
/**
|
||||
* Returns the low level (work)sheet object from
|
||||
* the supplied sheet reference
|
||||
*/
|
||||
public CTWorksheet getSheet(CTSheet sheet) throws IOException, XmlException {
|
||||
PackagePart sheetPart =
|
||||
getRelatedPackagePart(sheet.getId());
|
||||
WorksheetDocument sheetDoc =
|
||||
WorksheetDocument.Factory.parse(sheetPart.getInputStream());
|
||||
return sheetDoc.getWorksheet();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the shared string at the given index
|
||||
*/
|
||||
public String getSharedString(int index) {
|
||||
return this.sharedStrings.get(index);
|
||||
}
|
||||
protected SharedStringsTable _getSharedStringsTable() {
|
||||
return sharedStrings;
|
||||
}
|
||||
}
|
|
@ -1,78 +0,0 @@
|
|||
/* ====================================================================
|
||||
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.hssf.model;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import org.apache.xmlbeans.XmlException;
|
||||
import org.openxml4j.opc.PackagePart;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSst;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.SstDocument;
|
||||
|
||||
|
||||
public class SharedStringsTable extends LinkedList<String> {
|
||||
public static final String MAIN_SML_NS_URI = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
|
||||
|
||||
private SstDocument doc;
|
||||
private PackagePart part;
|
||||
|
||||
public SharedStringsTable(PackagePart part) throws IOException, XmlException {
|
||||
this.part = part;
|
||||
doc = SstDocument.Factory.parse(
|
||||
part.getInputStream()
|
||||
);
|
||||
read();
|
||||
}
|
||||
|
||||
private void read() {
|
||||
CTRst[] sts = doc.getSst().getSiArray();
|
||||
for (int i = 0; i < sts.length; i++) {
|
||||
add(sts[i].getT());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the current shared strings table into
|
||||
* the associated OOXML PackagePart
|
||||
*/
|
||||
public void write() throws IOException {
|
||||
CTSst sst = doc.getSst();
|
||||
|
||||
// Remove the old list
|
||||
for(int i=sst.sizeOfSiArray() - 1; i>=0; i--) {
|
||||
sst.removeSi(i);
|
||||
}
|
||||
|
||||
// Add the new one
|
||||
for(String s : this) {
|
||||
sst.addNewSi().setT(s);
|
||||
}
|
||||
|
||||
// Update the counts
|
||||
sst.setCount(this.size());
|
||||
sst.setUniqueCount(this.size());
|
||||
|
||||
// Write out
|
||||
OutputStream out = part.getOutputStream();
|
||||
doc.save(out);
|
||||
out.close();
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/* ====================================================================
|
||||
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.hssf.usermodel;
|
||||
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;
|
||||
|
||||
/**
|
||||
* User facing wrapper around an underlying cell object
|
||||
*/
|
||||
public class HSSFXMLCell {
|
||||
private CTCell cell;
|
||||
|
||||
/** The workbook to which this cell belongs */
|
||||
private final HSSFXMLWorkbook workbook;
|
||||
|
||||
public HSSFXMLCell(CTCell rawCell, HSSFXMLWorkbook workbook) {
|
||||
this.cell = rawCell;
|
||||
this.workbook = workbook;
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats the cell's contents, based on its type,
|
||||
* and returns it as a string.
|
||||
*/
|
||||
public String getStringValue() {
|
||||
|
||||
switch (cell.getT().intValue()) {
|
||||
case STCellType.INT_S:
|
||||
return this.workbook.getSharedString(Integer.valueOf(cell.getV()));
|
||||
case STCellType.INT_INLINE_STR:
|
||||
return cell.getV();
|
||||
case STCellType.INT_N:
|
||||
return cell.getV();
|
||||
// TODO: support other types
|
||||
default:
|
||||
return "UNSUPPORTED CELL TYPE: '" + cell.getT() + "'";
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return cell.getR() + " - " + getStringValue();
|
||||
}
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
/* ====================================================================
|
||||
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.hssf.usermodel;
|
||||
|
||||
import org.apache.poi.POIXMLDocument;
|
||||
import org.apache.poi.hssf.HSSFXML;
|
||||
|
||||
/**
|
||||
* High level representation of a ooxml workbook.
|
||||
* This is the first object most users will construct whether
|
||||
* they are reading or writing a workbook. It is also the
|
||||
* top level object for creating new sheets/etc.
|
||||
*/
|
||||
public class HSSFXMLWorkbook extends POIXMLDocument {
|
||||
private HSSFXML hssfXML;
|
||||
|
||||
public HSSFXMLWorkbook(HSSFXML xml) {
|
||||
super(xml);
|
||||
this.hssfXML = xml;
|
||||
}
|
||||
|
||||
public HSSFXML _getHSSFXML() {
|
||||
return hssfXML;
|
||||
}
|
||||
|
||||
public String getSharedString(int index) {
|
||||
return hssfXML.getSharedString(index);
|
||||
}
|
||||
}
|
|
@ -1,261 +0,0 @@
|
|||
/* ====================================================================
|
||||
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.hxf;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.PushbackInputStream;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.apache.poi.POIXMLDocument;
|
||||
import org.apache.poi.poifs.common.POIFSConstants;
|
||||
import org.apache.poi.util.IOUtils;
|
||||
import org.apache.xmlbeans.XmlException;
|
||||
import org.dom4j.Document;
|
||||
import org.dom4j.DocumentException;
|
||||
import org.dom4j.io.SAXReader;
|
||||
import org.openxml4j.exceptions.InvalidFormatException;
|
||||
import org.openxml4j.exceptions.OpenXML4JException;
|
||||
import org.openxml4j.opc.Package;
|
||||
import org.openxml4j.opc.PackageAccess;
|
||||
import org.openxml4j.opc.PackagePart;
|
||||
import org.openxml4j.opc.PackagePartName;
|
||||
import org.openxml4j.opc.PackageRelationship;
|
||||
import org.openxml4j.opc.PackageRelationshipCollection;
|
||||
import org.openxml4j.opc.PackagingURIHelper;
|
||||
import org.openxml4j.opc.RelationshipSource;
|
||||
import org.openxml4j.opc.internal.PackagePropertiesPart;
|
||||
import org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.CTProperties;
|
||||
import org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument;
|
||||
|
||||
/**
|
||||
* Parent class of the low level interface to
|
||||
* all POI XML (OOXML) implementations.
|
||||
* Normal users should probably deal with things that
|
||||
* extends {@link POIXMLDocument}, unless they really
|
||||
* do need to get low level access to the files.
|
||||
*
|
||||
* If you are using these low level classes, then you
|
||||
* will almost certainly need to refer to the OOXML
|
||||
* specifications from
|
||||
* http://www.ecma-international.org/publications/standards/Ecma-376.htm
|
||||
*
|
||||
* WARNING - APIs expected to change rapidly
|
||||
*/
|
||||
public abstract class HXFDocument {
|
||||
public static final String CORE_PROPERTIES_REL_TYPE = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties";
|
||||
public static final String EXTENDED_PROPERTIES_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties";
|
||||
|
||||
/**
|
||||
* File package/container.
|
||||
*/
|
||||
protected Package container;
|
||||
/**
|
||||
* The Package Part for our base document
|
||||
*/
|
||||
protected PackagePart basePart;
|
||||
/**
|
||||
* The base document of this instance, eg Workbook for
|
||||
* xslsx
|
||||
*/
|
||||
protected Document baseDocument;
|
||||
|
||||
protected HXFDocument(Package container, String baseContentType) throws OpenXML4JException {
|
||||
this.container = container;
|
||||
|
||||
// Find the base document
|
||||
basePart = getSinglePartByType(baseContentType);
|
||||
|
||||
// And load it up
|
||||
try {
|
||||
SAXReader reader = new SAXReader();
|
||||
baseDocument = reader.read(basePart.getInputStream());
|
||||
} catch (DocumentException e) {
|
||||
throw new OpenXML4JException(e.getMessage());
|
||||
} catch (IOException ioe) {
|
||||
throw new OpenXML4JException(ioe.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that the supplied InputStream (which MUST
|
||||
* support mark and reset, or be a PushbackInputStream)
|
||||
* has a OOXML (zip) header at the start of it.
|
||||
* If your InputStream does not support mark / reset,
|
||||
* then wrap it in a PushBackInputStream, then be
|
||||
* sure to always use that, and not the original!
|
||||
* @param inp An InputStream which supports either mark/reset, or is a PushbackInputStream
|
||||
*/
|
||||
public static boolean hasOOXMLHeader(InputStream inp) throws IOException {
|
||||
// We want to peek at the first 4 bytes
|
||||
inp.mark(4);
|
||||
|
||||
byte[] header = new byte[4];
|
||||
IOUtils.readFully(inp, header);
|
||||
|
||||
// Wind back those 4 bytes
|
||||
if(inp instanceof PushbackInputStream) {
|
||||
PushbackInputStream pin = (PushbackInputStream)inp;
|
||||
pin.unread(header);
|
||||
} else {
|
||||
inp.reset();
|
||||
}
|
||||
|
||||
// Did it match the ooxml zip signature?
|
||||
return (
|
||||
header[0] == POIFSConstants.OOXML_FILE_HEADER[0] &&
|
||||
header[1] == POIFSConstants.OOXML_FILE_HEADER[1] &&
|
||||
header[2] == POIFSConstants.OOXML_FILE_HEADER[2] &&
|
||||
header[3] == POIFSConstants.OOXML_FILE_HEADER[3]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the (single) PackagePart with the supplied
|
||||
* content type.
|
||||
* @param contentType The content type to search for
|
||||
* @throws IllegalArgumentException If we don't find a single part of that type
|
||||
*/
|
||||
private PackagePart getSinglePartByType(String contentType) throws IllegalArgumentException {
|
||||
ArrayList<PackagePart> parts =
|
||||
container.getPartsByContentType(contentType);
|
||||
if(parts.size() != 1) {
|
||||
throw new IllegalArgumentException("Expecting one entry with content type of " + contentType + ", but found " + parts.size());
|
||||
}
|
||||
return parts.get(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the (single) PackagePart which is defined as
|
||||
* the supplied relation content type of the specified part,
|
||||
* or null if none found.
|
||||
* @param relationType The relation content type to search for
|
||||
* @throws IllegalArgumentException If we find more than one part of that type
|
||||
*/
|
||||
protected PackagePart getSinglePartByRelationType(String relationType, RelationshipSource part) throws IllegalArgumentException, OpenXML4JException {
|
||||
PackageRelationshipCollection rels =
|
||||
part.getRelationshipsByType(relationType);
|
||||
if(rels.size() == 0) {
|
||||
return null;
|
||||
}
|
||||
if(rels.size() > 1) {
|
||||
throw new IllegalArgumentException("Found " + rels.size() + " relations for the type " + relationType + ", should only ever be one!");
|
||||
}
|
||||
PackageRelationship rel = rels.getRelationship(0);
|
||||
return getPackagePart(rel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the (single) PackagePart which is defined as
|
||||
* the supplied relation content type of the base
|
||||
* container, or null if none found.
|
||||
* @param relationType The relation content type to search for
|
||||
* @throws IllegalArgumentException If we find more than one part of that type
|
||||
*/
|
||||
protected PackagePart getSinglePartByRelationType(String relationType) throws IllegalArgumentException, OpenXML4JException {
|
||||
return getSinglePartByRelationType(relationType, container);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the PackagePart for the given relation
|
||||
* id. This will normally come from a r:id attribute
|
||||
* on part of the base document.
|
||||
* @param partId The r:id pointing to the other PackagePart
|
||||
*/
|
||||
protected PackagePart getRelatedPackagePart(String partId) {
|
||||
PackageRelationship rel =
|
||||
basePart.getRelationship(partId);
|
||||
return getPackagePart(rel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the PackagePart for the given Relationship
|
||||
* object. Normally you'll want to go via a content type
|
||||
* or r:id to get one of those.
|
||||
*/
|
||||
protected PackagePart getPackagePart(PackageRelationship rel) {
|
||||
PackagePartName relName;
|
||||
try {
|
||||
relName = PackagingURIHelper.createPartName(rel.getTargetURI());
|
||||
} catch(InvalidFormatException e) {
|
||||
throw new InternalError(e.getMessage());
|
||||
}
|
||||
|
||||
PackagePart part = container.getPart(relName);
|
||||
if(part == null) {
|
||||
throw new IllegalArgumentException("No part found for rel " + rel);
|
||||
}
|
||||
return part;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves all the PackageParts which are defined as
|
||||
* relationships of the base document with the
|
||||
* specified content type.
|
||||
*/
|
||||
protected PackagePart[] getRelatedByType(String contentType) throws InvalidFormatException {
|
||||
PackageRelationshipCollection partsC =
|
||||
basePart.getRelationshipsByType(contentType);
|
||||
|
||||
PackagePart[] parts = new PackagePart[partsC.size()];
|
||||
int count = 0;
|
||||
for (PackageRelationship rel : partsC) {
|
||||
parts[count] = getPackagePart(rel);
|
||||
count++;
|
||||
}
|
||||
return parts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the package container.
|
||||
* @return The package associated to this document.
|
||||
*/
|
||||
public Package getPackage() {
|
||||
return container;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the core document properties (core ooxml properties).
|
||||
*/
|
||||
public PackagePropertiesPart getCoreProperties() throws OpenXML4JException, XmlException, IOException {
|
||||
PackagePart propsPart = getSinglePartByRelationType(CORE_PROPERTIES_REL_TYPE);
|
||||
if(propsPart == null) {
|
||||
return null;
|
||||
}
|
||||
return (PackagePropertiesPart)propsPart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the extended document properties (extended ooxml properties)
|
||||
*/
|
||||
public CTProperties getExtendedProperties() throws OpenXML4JException, XmlException, IOException {
|
||||
PackagePart propsPart = getSinglePartByRelationType(EXTENDED_PROPERTIES_REL_TYPE);
|
||||
|
||||
PropertiesDocument props = PropertiesDocument.Factory.parse(
|
||||
propsPart.getInputStream());
|
||||
return props.getProperties();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an opened OOXML Package for the supplied File
|
||||
* @param f File to open
|
||||
*/
|
||||
public static Package openPackage(File f) throws InvalidFormatException {
|
||||
return Package.open(f.toString(), PackageAccess.READ_WRITE);
|
||||
}
|
||||
}
|
|
@ -1,160 +0,0 @@
|
|||
/* ====================================================================
|
||||
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.hssf;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.apache.poi.hssf.model.SharedStringsTable;
|
||||
import org.apache.poi.hxf.HXFDocument;
|
||||
import org.openxml4j.opc.Package;
|
||||
import org.openxml4j.opc.PackagePart;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
public class TestHSSFXML extends TestCase {
|
||||
/**
|
||||
* Uses the old style schemas.microsoft.com schema uri
|
||||
*/
|
||||
private File sampleFileBeta;
|
||||
/**
|
||||
* Uses the new style schemas.openxmlformats.org schema uri
|
||||
*/
|
||||
private File sampleFile;
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
sampleFile = new File(
|
||||
System.getProperty("HSSF.testdata.path") +
|
||||
File.separator + "sample.xlsx"
|
||||
);
|
||||
sampleFileBeta = new File(
|
||||
System.getProperty("HSSF.testdata.path") +
|
||||
File.separator + "sample-beta.xlsx"
|
||||
);
|
||||
}
|
||||
|
||||
public void testContainsMainContentType() throws Exception {
|
||||
Package pack = HXFDocument.openPackage(sampleFile);
|
||||
|
||||
boolean found = false;
|
||||
for(PackagePart part : pack.getParts()) {
|
||||
if(part.getContentType().equals(HSSFXML.MAIN_CONTENT_TYPE)) {
|
||||
found = true;
|
||||
}
|
||||
System.out.println(part);
|
||||
}
|
||||
assertTrue(found);
|
||||
}
|
||||
|
||||
public void testOpen() throws Exception {
|
||||
HXFDocument.openPackage(sampleFile);
|
||||
HXFDocument.openPackage(sampleFileBeta);
|
||||
|
||||
HSSFXML xml;
|
||||
|
||||
// With an old-style uri, as found in a file produced
|
||||
// with the office 2007 beta, will fail, as we don't
|
||||
// translate things
|
||||
try {
|
||||
xml = new HSSFXML(
|
||||
HXFDocument.openPackage(sampleFileBeta)
|
||||
);
|
||||
fail();
|
||||
} catch(Exception e) {}
|
||||
|
||||
// With the finalised uri, should be fine
|
||||
xml = new HSSFXML(
|
||||
HXFDocument.openPackage(sampleFile)
|
||||
);
|
||||
|
||||
// Check it has a workbook
|
||||
assertNotNull(xml.getWorkbook());
|
||||
}
|
||||
|
||||
public void testSheetBasics() throws Exception {
|
||||
HSSFXML xml = new HSSFXML(
|
||||
HXFDocument.openPackage(sampleFile)
|
||||
);
|
||||
|
||||
// Should have three sheets
|
||||
assertEquals(3, xml.getSheetReferences().sizeOfSheetArray());
|
||||
assertEquals(3, xml.getSheetReferences().getSheetArray().length);
|
||||
|
||||
// Check they're as expected
|
||||
CTSheet[] sheets = xml.getSheetReferences().getSheetArray();
|
||||
assertEquals("Sheet1", sheets[0].getName());
|
||||
assertEquals("Sheet2", sheets[1].getName());
|
||||
assertEquals("Sheet3", sheets[2].getName());
|
||||
assertEquals("rId1", sheets[0].getId());
|
||||
assertEquals("rId2", sheets[1].getId());
|
||||
assertEquals("rId3", sheets[2].getId());
|
||||
|
||||
// Now get those objects
|
||||
assertNotNull(xml.getSheet(sheets[0]));
|
||||
assertNotNull(xml.getSheet(sheets[1]));
|
||||
assertNotNull(xml.getSheet(sheets[2]));
|
||||
}
|
||||
|
||||
public void testMetadataBasics() throws Exception {
|
||||
HSSFXML xml = new HSSFXML(
|
||||
HXFDocument.openPackage(sampleFile)
|
||||
);
|
||||
assertNotNull(xml.getCoreProperties());
|
||||
assertNotNull(xml.getExtendedProperties());
|
||||
|
||||
assertEquals("Microsoft Excel", xml.getExtendedProperties().getApplication());
|
||||
assertEquals(0, xml.getExtendedProperties().getCharacters());
|
||||
assertEquals(0, xml.getExtendedProperties().getLines());
|
||||
|
||||
assertEquals(null, xml.getCoreProperties().getTitleProperty().getValue());
|
||||
assertEquals(null, xml.getCoreProperties().getSubjectProperty().getValue());
|
||||
}
|
||||
|
||||
public void testSharedStringBasics() throws Exception {
|
||||
HSSFXML xml = new HSSFXML(
|
||||
HXFDocument.openPackage(sampleFile)
|
||||
);
|
||||
assertNotNull(xml._getSharedStringsTable());
|
||||
|
||||
SharedStringsTable sst = xml._getSharedStringsTable();
|
||||
assertEquals(10, sst.size());
|
||||
|
||||
assertEquals("Lorem", sst.get(0));
|
||||
for(int i=0; i<sst.size(); i++) {
|
||||
assertEquals(sst.get(i), xml.getSharedString(i));
|
||||
}
|
||||
|
||||
// Add a few more, then save and reload, checking
|
||||
// changes have been kept
|
||||
sst.add("Foo");
|
||||
sst.add("Bar");
|
||||
sst.set(0, "LoremLorem");
|
||||
|
||||
sst.write();
|
||||
|
||||
xml = new HSSFXML(xml.getPackage());
|
||||
sst = xml._getSharedStringsTable();
|
||||
assertEquals(12, sst.size());
|
||||
|
||||
assertEquals("LoremLorem", sst.get(0));
|
||||
for(int i=0; i<sst.size(); i++) {
|
||||
assertEquals(sst.get(i), xml.getSharedString(i));
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue