#54916 - POI does not always read all the slides in pptx files
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1723966 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b3b4ed6564
commit
f56b918b16
@ -259,12 +259,22 @@ public class TestAllFiles {
|
|||||||
// non-TNEF files
|
// non-TNEF files
|
||||||
EXPECTED_FAILURES.add("ddf/Container.dat");
|
EXPECTED_FAILURES.add("ddf/Container.dat");
|
||||||
EXPECTED_FAILURES.add("ddf/47143.dat");
|
EXPECTED_FAILURES.add("ddf/47143.dat");
|
||||||
|
|
||||||
|
// sheet cloning errors
|
||||||
|
EXPECTED_FAILURES.add("spreadsheet/47813.xlsx");
|
||||||
|
EXPECTED_FAILURES.add("spreadsheet/56450.xls");
|
||||||
|
EXPECTED_FAILURES.add("spreadsheet/57231_MixedGasReport.xls");
|
||||||
|
EXPECTED_FAILURES.add("spreadsheet/OddStyleRecord.xls");
|
||||||
|
EXPECTED_FAILURES.add("spreadsheet/WithChartSheet.xlsx");
|
||||||
|
EXPECTED_FAILURES.add("spreadsheet/chart_sheet.xlsx");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Set<String> IGNORED = new HashSet<String>();
|
private static final Set<String> IGNORED = new HashSet<String>();
|
||||||
static {
|
static {
|
||||||
// need JDK8+ - https://bugs.openjdk.java.net/browse/JDK-8038081
|
// need JDK8+ - https://bugs.openjdk.java.net/browse/JDK-8038081
|
||||||
IGNORED.add("slideshow/42474-2.ppt");
|
IGNORED.add("slideshow/42474-2.ppt");
|
||||||
|
// OPC handler works / XSSF handler fails
|
||||||
|
IGNORED.add("spreadsheet/57181.xlsm");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Parameters(name="{index}: {0} using {1}")
|
@Parameters(name="{index}: {0} using {1}")
|
||||||
|
@ -29,6 +29,7 @@ import org.apache.poi.ss.usermodel.Row;
|
|||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
import org.apache.poi.ss.usermodel.WorkbookFactory;
|
import org.apache.poi.ss.usermodel.WorkbookFactory;
|
||||||
|
import org.apache.poi.util.RecordFormatException;
|
||||||
|
|
||||||
public abstract class SpreadsheetHandler extends AbstractFileHandler {
|
public abstract class SpreadsheetHandler extends AbstractFileHandler {
|
||||||
public void handleWorkbook(Workbook wb, String extension) throws IOException {
|
public void handleWorkbook(Workbook wb, String extension) throws IOException {
|
||||||
@ -54,6 +55,10 @@ public abstract class SpreadsheetHandler extends AbstractFileHandler {
|
|||||||
assertNotNull(read);
|
assertNotNull(read);
|
||||||
|
|
||||||
readContent(read);
|
readContent(read);
|
||||||
|
|
||||||
|
modifyContent(read);
|
||||||
|
|
||||||
|
read.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ByteArrayOutputStream writeToArray(Workbook wb)
|
private ByteArrayOutputStream writeToArray(Workbook wb)
|
||||||
@ -88,4 +93,25 @@ public abstract class SpreadsheetHandler extends AbstractFileHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void modifyContent(Workbook wb) {
|
||||||
|
for (int i=wb.getNumberOfSheets()-1; i>=0; i--) {
|
||||||
|
try {
|
||||||
|
wb.cloneSheet(i);
|
||||||
|
} catch (RecordFormatException e) {
|
||||||
|
if (e.getCause() instanceof CloneNotSupportedException) {
|
||||||
|
// ignore me
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
if ("Could not find 'internal references' EXTERNALBOOK".equals(e.getMessage())) {
|
||||||
|
continue;
|
||||||
|
} else if ("CountryRecord not found".equals(e.getMessage())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -68,6 +68,8 @@ public class XSSFFileHandler extends SpreadsheetHandler {
|
|||||||
exportToXML(wb);
|
exportToXML(wb);
|
||||||
|
|
||||||
checkXSSFReader(OPCPackage.open(new ByteArrayInputStream(bytes)));
|
checkXSSFReader(OPCPackage.open(new ByteArrayInputStream(bytes)));
|
||||||
|
|
||||||
|
wb.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,11 +20,9 @@ import java.io.IOException;
|
|||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
@ -56,9 +54,39 @@ public class POIXMLDocumentPart {
|
|||||||
|
|
||||||
private String coreDocumentRel = PackageRelationshipTypes.CORE_DOCUMENT;
|
private String coreDocumentRel = PackageRelationshipTypes.CORE_DOCUMENT;
|
||||||
private PackagePart packagePart;
|
private PackagePart packagePart;
|
||||||
private PackageRelationship packageRel;
|
|
||||||
private POIXMLDocumentPart parent;
|
private POIXMLDocumentPart parent;
|
||||||
private Map<String,POIXMLDocumentPart> relations = new LinkedHashMap<String,POIXMLDocumentPart>();
|
private Map<String,RelationPart> relations = new LinkedHashMap<String,RelationPart>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The RelationPart is a cached relationship between the document, which contains the RelationPart,
|
||||||
|
* and one of its referenced child document parts.
|
||||||
|
* The child document parts may only belong to one parent, but it's often referenced by other
|
||||||
|
* parents too, having varying {@link PackageRelationship#getId() relationship ids} pointing to it.
|
||||||
|
*/
|
||||||
|
public static class RelationPart {
|
||||||
|
private final PackageRelationship relationship;
|
||||||
|
private final POIXMLDocumentPart documentPart;
|
||||||
|
|
||||||
|
RelationPart(PackageRelationship relationship, POIXMLDocumentPart documentPart) {
|
||||||
|
this.relationship = relationship;
|
||||||
|
this.documentPart = documentPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the cached relationship, which uniquely identifies this child document part within the parent
|
||||||
|
*/
|
||||||
|
public PackageRelationship getRelationship() {
|
||||||
|
return relationship;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the child document part
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <T extends POIXMLDocumentPart> T getDocumentPart() {
|
||||||
|
return (T)documentPart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Counter that provides the amount of incoming relations from other parts
|
* Counter that provides the amount of incoming relations from other parts
|
||||||
@ -91,21 +119,8 @@ public class POIXMLDocumentPart {
|
|||||||
* Construct POIXMLDocumentPart representing a custom "core document" package part.
|
* Construct POIXMLDocumentPart representing a custom "core document" package part.
|
||||||
*/
|
*/
|
||||||
public POIXMLDocumentPart(OPCPackage pkg, String coreDocumentRel) {
|
public POIXMLDocumentPart(OPCPackage pkg, String coreDocumentRel) {
|
||||||
|
this(getPartFromOPCPackage(pkg, coreDocumentRel));
|
||||||
this.coreDocumentRel = coreDocumentRel;
|
this.coreDocumentRel = coreDocumentRel;
|
||||||
PackageRelationship coreRel = pkg.getRelationshipsByType(this.coreDocumentRel).getRelationship(0);
|
|
||||||
|
|
||||||
if (coreRel == null) {
|
|
||||||
coreRel = pkg.getRelationshipsByType(PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0);
|
|
||||||
if (coreRel != null) {
|
|
||||||
throw new POIXMLException("Strict OOXML isn't currently supported, please see bug #57699");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (coreRel == null) {
|
|
||||||
throw new POIXMLException("OOXML file structure broken/invalid - no core document found!");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.packagePart = pkg.getPart(coreRel);
|
|
||||||
this.packageRel = coreRel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -113,20 +128,50 @@ public class POIXMLDocumentPart {
|
|||||||
*
|
*
|
||||||
* @see #createRelationship(POIXMLRelation, POIXMLFactory, int, boolean)
|
* @see #createRelationship(POIXMLRelation, POIXMLFactory, int, boolean)
|
||||||
*/
|
*/
|
||||||
public POIXMLDocumentPart(){
|
public POIXMLDocumentPart() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an POIXMLDocumentPart representing the given package part and relationship.
|
* Creates an POIXMLDocumentPart representing the given package part and relationship.
|
||||||
* Called by {@link #read(POIXMLFactory, java.util.Map)} when reading in an exisiting file.
|
* Called by {@link #read(POIXMLFactory, java.util.Map)} when reading in an existing file.
|
||||||
*
|
*
|
||||||
* @param part - The package part that holds xml data represenring this sheet.
|
* @param part - The package part that holds xml data representing this sheet.
|
||||||
|
* @see #read(POIXMLFactory, java.util.Map)
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public POIXMLDocumentPart(PackagePart part) {
|
||||||
|
this(null, part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an POIXMLDocumentPart representing the given package part, relationship and parent
|
||||||
|
* Called by {@link #read(POIXMLFactory, java.util.Map)} when reading in an existing file.
|
||||||
|
*
|
||||||
|
* @param parent - Parent part
|
||||||
|
* @param part - The package part that holds xml data representing this sheet.
|
||||||
|
* @see #read(POIXMLFactory, java.util.Map)
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public POIXMLDocumentPart(POIXMLDocumentPart parent, PackagePart part) {
|
||||||
|
this.packagePart = part;
|
||||||
|
this.parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an POIXMLDocumentPart representing the given package part and relationship.
|
||||||
|
* Called by {@link #read(POIXMLFactory, java.util.Map)} when reading in an existing file.
|
||||||
|
*
|
||||||
|
* @param part - The package part that holds xml data representing this sheet.
|
||||||
* @param rel - the relationship of the given package part
|
* @param rel - the relationship of the given package part
|
||||||
* @see #read(POIXMLFactory, java.util.Map)
|
* @see #read(POIXMLFactory, java.util.Map)
|
||||||
|
*
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public POIXMLDocumentPart(PackagePart part, PackageRelationship rel){
|
public POIXMLDocumentPart(PackagePart part, PackageRelationship rel){
|
||||||
this.packagePart = part;
|
this(null, part);
|
||||||
this.packageRel = rel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -137,11 +182,12 @@ public class POIXMLDocumentPart {
|
|||||||
* @param part - The package part that holds xml data represenring this sheet.
|
* @param part - The package part that holds xml data represenring this sheet.
|
||||||
* @param rel - the relationship of the given package part
|
* @param rel - the relationship of the given package part
|
||||||
* @see #read(POIXMLFactory, java.util.Map)
|
* @see #read(POIXMLFactory, java.util.Map)
|
||||||
|
*
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public POIXMLDocumentPart(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel){
|
public POIXMLDocumentPart(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel){
|
||||||
this.packagePart = part;
|
this(parent, part);
|
||||||
this.packageRel = rel;
|
|
||||||
this.parent = parent;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -158,8 +204,7 @@ public class POIXMLDocumentPart {
|
|||||||
" but found " + cores.size() + " parts of the right type"
|
" but found " + cores.size() + " parts of the right type"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
packageRel = cores.getRelationship(0);
|
packagePart = packagePart.getRelatedPart(cores.getRelationship(0));
|
||||||
packagePart = packagePart.getRelatedPart(packageRel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -175,9 +220,28 @@ public class POIXMLDocumentPart {
|
|||||||
* Provides access to the PackageRelationship that identifies this POIXMLDocumentPart
|
* Provides access to the PackageRelationship that identifies this POIXMLDocumentPart
|
||||||
*
|
*
|
||||||
* @return the PackageRelationship that identifies this POIXMLDocumentPart
|
* @return the PackageRelationship that identifies this POIXMLDocumentPart
|
||||||
|
*
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
*/
|
*/
|
||||||
public final PackageRelationship getPackageRelationship(){
|
@Deprecated
|
||||||
return packageRel;
|
@SuppressWarnings("resource")
|
||||||
|
public final PackageRelationship getPackageRelationship() {
|
||||||
|
if (this.parent != null) {
|
||||||
|
for (RelationPart rp : parent.getRelationParts()) {
|
||||||
|
if (rp.getDocumentPart() == this) {
|
||||||
|
return rp.getRelationship();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
OPCPackage pkg = getPackagePart().getPackage();
|
||||||
|
String partName = getPackagePart().getPartName().getName();
|
||||||
|
for (PackageRelationship rel : pkg.getRelationships()) {
|
||||||
|
if (rel.getTargetURI().toASCIIString().equals(partName)) {
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -186,7 +250,21 @@ public class POIXMLDocumentPart {
|
|||||||
* @return child relations
|
* @return child relations
|
||||||
*/
|
*/
|
||||||
public final List<POIXMLDocumentPart> getRelations(){
|
public final List<POIXMLDocumentPart> getRelations(){
|
||||||
return Collections.unmodifiableList(new ArrayList<POIXMLDocumentPart>(relations.values()));
|
List<POIXMLDocumentPart> l = new ArrayList<POIXMLDocumentPart>();
|
||||||
|
for (RelationPart rp : relations.values()) {
|
||||||
|
l.add(rp.getDocumentPart());
|
||||||
|
}
|
||||||
|
return Collections.unmodifiableList(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of child relations for this POIXMLDocumentPart
|
||||||
|
*
|
||||||
|
* @return child relations
|
||||||
|
*/
|
||||||
|
public final List<RelationPart> getRelationParts() {
|
||||||
|
List<RelationPart> l = new ArrayList<RelationPart>(relations.values());
|
||||||
|
return Collections.unmodifiableList(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -201,7 +279,8 @@ public class POIXMLDocumentPart {
|
|||||||
* @return the target part of the relation, or null, if none exists
|
* @return the target part of the relation, or null, if none exists
|
||||||
*/
|
*/
|
||||||
public final POIXMLDocumentPart getRelationById(String id) {
|
public final POIXMLDocumentPart getRelationById(String id) {
|
||||||
return relations.get(id);
|
RelationPart rp = relations.get(id);
|
||||||
|
return (rp == null) ? null : rp.getDocumentPart();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -217,12 +296,9 @@ public class POIXMLDocumentPart {
|
|||||||
* parts are not related.
|
* parts are not related.
|
||||||
*/
|
*/
|
||||||
public final String getRelationId(POIXMLDocumentPart part) {
|
public final String getRelationId(POIXMLDocumentPart part) {
|
||||||
Iterator<Entry<String, POIXMLDocumentPart>> iter = relations.entrySet().iterator();
|
for (RelationPart rp : relations.values()) {
|
||||||
while (iter.hasNext())
|
if (rp.getDocumentPart() == part) {
|
||||||
{
|
return rp.getRelationship().getId();
|
||||||
Entry<String, POIXMLDocumentPart> entry = iter.next();
|
|
||||||
if (entry.getValue() == part) {
|
|
||||||
return entry.getKey();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -232,10 +308,66 @@ public class POIXMLDocumentPart {
|
|||||||
* Add a new child POIXMLDocumentPart
|
* Add a new child POIXMLDocumentPart
|
||||||
*
|
*
|
||||||
* @param part the child to add
|
* @param part the child to add
|
||||||
|
*
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
*/
|
*/
|
||||||
public final void addRelation(String id,POIXMLDocumentPart part){
|
@Deprecated
|
||||||
relations.put(id,part);
|
public final void addRelation(String id,POIXMLDocumentPart part) {
|
||||||
|
PackageRelationship pr = part.getPackagePart().getRelationship(id);
|
||||||
|
addRelation(pr, part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new child POIXMLDocumentPart
|
||||||
|
*
|
||||||
|
* @param relId the preferred relation id, when null the next free relation id will be used
|
||||||
|
* @param relationshipType the package relationship type
|
||||||
|
* @param part the child to add
|
||||||
|
*
|
||||||
|
* @since 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public final RelationPart addRelation(String relId, POIXMLRelation relationshipType, POIXMLDocumentPart part) {
|
||||||
|
PackageRelationship pr = findExistingRelation(part);
|
||||||
|
if (pr == null) {
|
||||||
|
PackagePartName ppn = part.getPackagePart().getPartName();
|
||||||
|
String relType = relationshipType.getRelation();
|
||||||
|
pr = packagePart.addRelationship(ppn, TargetMode.INTERNAL, relType, relId);
|
||||||
|
}
|
||||||
|
addRelation(pr, part);
|
||||||
|
return new RelationPart(pr, part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new child POIXMLDocumentPart
|
||||||
|
*
|
||||||
|
* @param pr the relationship of the child
|
||||||
|
* @param part the child to add
|
||||||
|
*/
|
||||||
|
private void addRelation(PackageRelationship pr, POIXMLDocumentPart part) {
|
||||||
|
relations.put(pr.getId(), new RelationPart(pr,part));
|
||||||
part.incrementRelationCounter();
|
part.incrementRelationCounter();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the new part was already added before via PackagePart.addRelationship()
|
||||||
|
*
|
||||||
|
* @param part
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private PackageRelationship findExistingRelation(POIXMLDocumentPart part) {
|
||||||
|
String ppn = part.getPackagePart().getPartName().getName();
|
||||||
|
try {
|
||||||
|
for (PackageRelationship pr : packagePart.getRelationships()) {
|
||||||
|
PackagePart pp = packagePart.getRelatedPart(pr);
|
||||||
|
if (ppn.equals(pp.getPartName().getName())) {
|
||||||
|
return pr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (InvalidFormatException e) {
|
||||||
|
throw new POIXMLException("invalid package relationships", e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -331,7 +463,8 @@ public class POIXMLDocumentPart {
|
|||||||
|
|
||||||
commit();
|
commit();
|
||||||
alreadySaved.add(this.getPackagePart());
|
alreadySaved.add(this.getPackagePart());
|
||||||
for(POIXMLDocumentPart p : relations.values()){
|
for(RelationPart rp : relations.values()){
|
||||||
|
POIXMLDocumentPart p = rp.getDocumentPart();
|
||||||
if (!alreadySaved.contains(p.getPackagePart())) {
|
if (!alreadySaved.contains(p.getPackagePart())) {
|
||||||
p.onSave(alreadySaved);
|
p.onSave(alreadySaved);
|
||||||
}
|
}
|
||||||
@ -364,7 +497,7 @@ public class POIXMLDocumentPart {
|
|||||||
* create nor recognize packages with equivalent part names.
|
* create nor recognize packages with equivalent part names.
|
||||||
*/
|
*/
|
||||||
public final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory){
|
public final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory){
|
||||||
return createRelationship(descriptor, factory, -1, false);
|
return createRelationship(descriptor, factory, -1, false).getDocumentPart();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -380,7 +513,7 @@ public class POIXMLDocumentPart {
|
|||||||
* create nor recognize packages with equivalent part names.
|
* create nor recognize packages with equivalent part names.
|
||||||
*/
|
*/
|
||||||
public final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx){
|
public final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx){
|
||||||
return createRelationship(descriptor, factory, idx, false);
|
return createRelationship(descriptor, factory, idx, false).getDocumentPart();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -396,7 +529,7 @@ public class POIXMLDocumentPart {
|
|||||||
* equivalent part names and package implementers shall neither
|
* equivalent part names and package implementers shall neither
|
||||||
* create nor recognize packages with equivalent part names.
|
* create nor recognize packages with equivalent part names.
|
||||||
*/
|
*/
|
||||||
protected final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx, boolean noRelation){
|
protected final RelationPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx, boolean noRelation){
|
||||||
try {
|
try {
|
||||||
PackagePartName ppName = PackagingURIHelper.createPartName(descriptor.getFileName(idx));
|
PackagePartName ppName = PackagingURIHelper.createPartName(descriptor.getFileName(idx));
|
||||||
PackageRelationship rel = null;
|
PackageRelationship rel = null;
|
||||||
@ -406,14 +539,14 @@ public class POIXMLDocumentPart {
|
|||||||
rel = packagePart.addRelationship(ppName, TargetMode.INTERNAL, descriptor.getRelation());
|
rel = packagePart.addRelationship(ppName, TargetMode.INTERNAL, descriptor.getRelation());
|
||||||
}
|
}
|
||||||
POIXMLDocumentPart doc = factory.newDocumentPart(descriptor);
|
POIXMLDocumentPart doc = factory.newDocumentPart(descriptor);
|
||||||
doc.packageRel = rel;
|
|
||||||
doc.packagePart = part;
|
doc.packagePart = part;
|
||||||
doc.parent = this;
|
doc.parent = this;
|
||||||
if(!noRelation) {
|
if (!noRelation) {
|
||||||
/* only add to relations, if according relationship is being created. */
|
/* only add to relations, if according relationship is being created. */
|
||||||
addRelation(rel.getId(),doc);
|
addRelation(rel,doc);
|
||||||
}
|
}
|
||||||
return doc;
|
|
||||||
|
return new RelationPart(rel,doc);
|
||||||
} catch (PartAlreadyExistsException pae) {
|
} catch (PartAlreadyExistsException pae) {
|
||||||
// Return the specific exception so the user knows
|
// Return the specific exception so the user knows
|
||||||
// that the name is already taken
|
// that the name is already taken
|
||||||
@ -432,40 +565,53 @@ public class POIXMLDocumentPart {
|
|||||||
* @param context context map containing already visited noted keyed by targetURI
|
* @param context context map containing already visited noted keyed by targetURI
|
||||||
*/
|
*/
|
||||||
protected void read(POIXMLFactory factory, Map<PackagePart, POIXMLDocumentPart> context) throws OpenXML4JException {
|
protected void read(POIXMLFactory factory, Map<PackagePart, POIXMLDocumentPart> context) throws OpenXML4JException {
|
||||||
|
PackagePart pp = getPackagePart();
|
||||||
|
// add mapping a second time, in case of initial caller hasn't done so
|
||||||
|
POIXMLDocumentPart otherChild = context.put(pp, this);
|
||||||
|
if (otherChild != null && otherChild != this) {
|
||||||
|
throw new POIXMLException("Unique PackagePart-POIXMLDocumentPart relation broken!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pp.hasRelationships()) return;
|
||||||
|
|
||||||
PackageRelationshipCollection rels = packagePart.getRelationships();
|
PackageRelationshipCollection rels = packagePart.getRelationships();
|
||||||
|
List<POIXMLDocumentPart> readLater = new ArrayList<POIXMLDocumentPart>();
|
||||||
|
|
||||||
|
// scan breadth-first, so parent-relations are hopefully the shallowest element
|
||||||
for (PackageRelationship rel : rels) {
|
for (PackageRelationship rel : rels) {
|
||||||
if(rel.getTargetMode() == TargetMode.INTERNAL){
|
if(rel.getTargetMode() == TargetMode.INTERNAL){
|
||||||
URI uri = rel.getTargetURI();
|
URI uri = rel.getTargetURI();
|
||||||
|
|
||||||
PackagePart p;
|
// check for internal references (e.g. '#Sheet1!A1')
|
||||||
|
PackagePartName relName;
|
||||||
if(uri.getRawFragment() != null) {
|
if(uri.getRawFragment() != null) {
|
||||||
/*
|
relName = PackagingURIHelper.createPartName(uri.getPath());
|
||||||
* For internal references (e.g. '#Sheet1!A1') the package part is null
|
|
||||||
*/
|
|
||||||
p = null;
|
|
||||||
} else {
|
} else {
|
||||||
PackagePartName relName = PackagingURIHelper.createPartName(uri);
|
relName = PackagingURIHelper.createPartName(uri);
|
||||||
p = packagePart.getPackage().getPart(relName);
|
|
||||||
if(p == null) {
|
|
||||||
logger.log(POILogger.ERROR, "Skipped invalid entry " + rel.getTargetURI());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!context.containsKey(p)) {
|
final PackagePart p = packagePart.getPackage().getPart(relName);
|
||||||
POIXMLDocumentPart childPart = factory.createDocumentPart(this, rel, p);
|
if (p == null) {
|
||||||
|
logger.log(POILogger.ERROR, "Skipped invalid entry " + rel.getTargetURI());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
POIXMLDocumentPart childPart = context.get(p);
|
||||||
|
if (childPart == null) {
|
||||||
|
childPart = factory.createDocumentPart(this, p);
|
||||||
childPart.parent = this;
|
childPart.parent = this;
|
||||||
addRelation(rel.getId(),childPart);
|
// already add child to context, so other children can reference it
|
||||||
if(p != null){
|
context.put(p, childPart);
|
||||||
context.put(p, childPart);
|
readLater.add(childPart);
|
||||||
if(p.hasRelationships()) childPart.read(factory, context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
addRelation(rel.getId(),context.get(p));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addRelation(rel,childPart);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (POIXMLDocumentPart childPart : readLater) {
|
||||||
|
childPart.read(factory, context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -511,4 +657,28 @@ public class POIXMLDocumentPart {
|
|||||||
public static void _invokeOnDocumentRead(POIXMLDocumentPart part) throws IOException {
|
public static void _invokeOnDocumentRead(POIXMLDocumentPart part) throws IOException {
|
||||||
part.onDocumentRead();
|
part.onDocumentRead();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the core document part
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
private static PackagePart getPartFromOPCPackage(OPCPackage pkg, String coreDocumentRel) {
|
||||||
|
PackageRelationship coreRel = pkg.getRelationshipsByType(coreDocumentRel).getRelationship(0);
|
||||||
|
|
||||||
|
if (coreRel != null) {
|
||||||
|
PackagePart pp = pkg.getPart(coreRel);
|
||||||
|
if (pp == null) {
|
||||||
|
throw new POIXMLException("OOXML file structure broken/invalid - core document '"+coreRel.getTargetURI()+"' not found.");
|
||||||
|
}
|
||||||
|
return pp;
|
||||||
|
}
|
||||||
|
|
||||||
|
coreRel = pkg.getRelationshipsByType(PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0);
|
||||||
|
if (coreRel != null) {
|
||||||
|
throw new POIXMLException("Strict OOXML isn't currently supported, please see bug #57699");
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new POIXMLException("OOXML file structure broken/invalid - no core document found!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,15 +16,24 @@
|
|||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi;
|
package org.apache.poi;
|
||||||
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
|
import org.apache.poi.POIXMLDocumentPart.RelationPart;
|
||||||
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
|
import org.apache.poi.util.POILogFactory;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a factory API that enables sub-classes to create instances of <code>POIXMLDocumentPart</code>
|
* Defines a factory API that enables sub-classes to create instances of <code>POIXMLDocumentPart</code>
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
*/
|
||||||
public abstract class POIXMLFactory {
|
public abstract class POIXMLFactory {
|
||||||
|
private static final POILogger LOGGER = POILogFactory.getLogger(POIXMLFactory.class);
|
||||||
|
|
||||||
|
private static final Class<?>[] PARENT_PART = {POIXMLDocumentPart.class, PackagePart.class};
|
||||||
|
private static final Class<?>[] ORPHAN_PART = {PackagePart.class};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a POIXMLDocumentPart from existing package part and relation. This method is called
|
* Create a POIXMLDocumentPart from existing package part and relation. This method is called
|
||||||
@ -34,8 +43,62 @@ public abstract class POIXMLFactory {
|
|||||||
* @param rel the package part relationship
|
* @param rel the package part relationship
|
||||||
* @param part the PackagePart representing the created instance
|
* @param part the PackagePart representing the created instance
|
||||||
* @return A new instance of a POIXMLDocumentPart.
|
* @return A new instance of a POIXMLDocumentPart.
|
||||||
|
*
|
||||||
|
* @since by POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
public abstract POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part);
|
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackagePart part) {
|
||||||
|
PackageRelationship rel = getPackageRelationship(parent, part);
|
||||||
|
POIXMLRelation descriptor = getDescriptor(rel.getRelationshipType());
|
||||||
|
|
||||||
|
if (descriptor == null || descriptor.getRelationClass() == null) {
|
||||||
|
LOGGER.log(POILogger.DEBUG, "using default POIXMLDocumentPart for " + rel.getRelationshipType());
|
||||||
|
return new POIXMLDocumentPart(parent, part);
|
||||||
|
}
|
||||||
|
|
||||||
|
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
return createDocumentPart(cls, PARENT_PART, new Object[]{parent, part});
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
return createDocumentPart(cls, ORPHAN_PART, new Object[]{part});
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new POIXMLException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Need to delegate instantiation to sub class because of constructor visibility
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
protected abstract POIXMLDocumentPart createDocumentPart
|
||||||
|
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
|
||||||
|
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns the descriptor for the given relationship type
|
||||||
|
*
|
||||||
|
* @return the descriptor or null if type is unknown
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
protected abstract POIXMLRelation getDescriptor(String relationshipType);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a POIXMLDocumentPart from existing package part and relation. This method is called
|
||||||
|
* from {@link POIXMLDocument#load(POIXMLFactory)} when parsing a document
|
||||||
|
*
|
||||||
|
* @param parent parent part
|
||||||
|
* @param rel the package part relationship
|
||||||
|
* @param part the PackagePart representing the created instance
|
||||||
|
* @return A new instance of a POIXMLDocumentPart.
|
||||||
|
*
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public final POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part) {
|
||||||
|
return createDocumentPart(parent, part);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new POIXMLDocumentPart using the supplied descriptor. This method is used when adding new parts
|
* Create a new POIXMLDocumentPart using the supplied descriptor. This method is used when adding new parts
|
||||||
@ -44,5 +107,33 @@ public abstract class POIXMLFactory {
|
|||||||
* @param descriptor describes the object to create
|
* @param descriptor describes the object to create
|
||||||
* @return A new instance of a POIXMLDocumentPart.
|
* @return A new instance of a POIXMLDocumentPart.
|
||||||
*/
|
*/
|
||||||
public abstract POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor);
|
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor) {
|
||||||
|
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
|
||||||
|
try {
|
||||||
|
return createDocumentPart(cls, null, null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new POIXMLException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the package relationship of the child part within the parent
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
protected PackageRelationship getPackageRelationship(POIXMLDocumentPart parent, PackagePart part) {
|
||||||
|
try {
|
||||||
|
String partName = part.getPartName().getName();
|
||||||
|
for (PackageRelationship pr : parent.getPackagePart().getRelationships()) {
|
||||||
|
String packName = pr.getTargetURI().toASCIIString();
|
||||||
|
if (packName.equalsIgnoreCase(partName)) {
|
||||||
|
return pr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (InvalidFormatException e) {
|
||||||
|
throw new POIXMLException("error while determining package relations", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new POIXMLException("package part isn't a child of the parent document.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,7 +117,7 @@ public abstract class POIXMLRelation {
|
|||||||
*/
|
*/
|
||||||
public Integer getFileNameIndex(POIXMLDocumentPart part) {
|
public Integer getFileNameIndex(POIXMLDocumentPart part) {
|
||||||
String regex = _defaultName.replace("#", "(\\d+)");
|
String regex = _defaultName.replace("#", "(\\d+)");
|
||||||
return Integer.parseInt(part.getPackageRelationship().getTargetURI().getPath().replaceAll(regex, "$1"));
|
return Integer.valueOf(part.getPackagePart().getPartName().getName().replaceAll(regex, "$1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -55,7 +55,7 @@ public final class PackageRelationship {
|
|||||||
/* End XML markup */
|
/* End XML markup */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* L'ID de la relation.
|
* Relation id.
|
||||||
*/
|
*/
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
@ -65,22 +65,22 @@ public final class PackageRelationship {
|
|||||||
private OPCPackage container;
|
private OPCPackage container;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Type de relation.
|
* Relationship type
|
||||||
*/
|
*/
|
||||||
private String relationshipType;
|
private String relationshipType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Partie source de cette relation.
|
* Part of this relationship source
|
||||||
*/
|
*/
|
||||||
private PackagePart source;
|
private PackagePart source;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Le mode de ciblage [Internal|External]
|
* Targeting mode [Internal|External]
|
||||||
*/
|
*/
|
||||||
private TargetMode targetMode;
|
private TargetMode targetMode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* URI de la partie cible.
|
* Target URI
|
||||||
*/
|
*/
|
||||||
private URI targetUri;
|
private URI targetUri;
|
||||||
|
|
||||||
|
@ -53,8 +53,19 @@ public class XDGFBaseContents extends XDGFXMLDocumentPart {
|
|||||||
protected Map<Long, XDGFShape> _shapes = new HashMap<Long, XDGFShape>();
|
protected Map<Long, XDGFShape> _shapes = new HashMap<Long, XDGFShape>();
|
||||||
protected List<XDGFConnection> _connections = new ArrayList<XDGFConnection>();
|
protected List<XDGFConnection> _connections = new ArrayList<XDGFConnection>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XDGFBaseContents(PackagePart part, XDGFDocument document) {
|
||||||
|
super(part, document);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XDGFBaseContents(PackagePart part, PackageRelationship rel, XDGFDocument document) {
|
public XDGFBaseContents(PackagePart part, PackageRelationship rel, XDGFDocument document) {
|
||||||
super(part, rel, document);
|
this(part, document);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Internal
|
@Internal
|
||||||
|
@ -18,69 +18,52 @@
|
|||||||
package org.apache.poi.xdgf.usermodel;
|
package org.apache.poi.xdgf.usermodel;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
import org.apache.poi.POIXMLException;
|
|
||||||
import org.apache.poi.POIXMLFactory;
|
import org.apache.poi.POIXMLFactory;
|
||||||
import org.apache.poi.POIXMLRelation;
|
import org.apache.poi.POIXMLRelation;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
|
||||||
import org.apache.poi.util.POILogFactory;
|
|
||||||
import org.apache.poi.util.POILogger;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates sub-classes of POIXMLDocumentPart depending on their relationship type
|
||||||
|
*/
|
||||||
public class XDGFFactory extends POIXMLFactory {
|
public class XDGFFactory extends POIXMLFactory {
|
||||||
|
|
||||||
private static final POILogger logger = POILogFactory
|
private final XDGFDocument document;
|
||||||
.getLogger(XDGFFactory.class);
|
|
||||||
|
|
||||||
private XDGFDocument _document;
|
|
||||||
|
|
||||||
public XDGFFactory(XDGFDocument document) {
|
public XDGFFactory(XDGFDocument document) {
|
||||||
_document = document;
|
this.document = document;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
protected POIXMLRelation getDescriptor(String relationshipType) {
|
||||||
|
return XDGFRelation.getInstance(relationshipType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent,
|
protected POIXMLDocumentPart createDocumentPart
|
||||||
PackageRelationship rel, PackagePart part) {
|
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
|
||||||
POIXMLRelation descriptor = XDGFRelation.getInstance(rel
|
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
|
||||||
.getRelationshipType());
|
Class<?>[] cl;
|
||||||
if (descriptor == null || descriptor.getRelationClass() == null) {
|
Object[] vals;
|
||||||
logger.log(POILogger.DEBUG, "using default POIXMLDocumentPart for "
|
if (classes == null) {
|
||||||
+ rel.getRelationshipType());
|
cl = new Class<?>[]{XDGFDocument.class};
|
||||||
return new POIXMLDocumentPart(part, rel);
|
vals = new Object[]{document};
|
||||||
|
} else {
|
||||||
|
cl = new Class<?>[classes.length+1];
|
||||||
|
System.arraycopy(classes, 0, cl, 0, classes.length);
|
||||||
|
cl[classes.length] = XDGFDocument.class;
|
||||||
|
vals = new Object[values.length+1];
|
||||||
|
System.arraycopy(values, 0, vals, 0, values.length);
|
||||||
|
vals[values.length] = document;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(cl);
|
||||||
Class<? extends POIXMLDocumentPart> cls = descriptor
|
return constructor.newInstance(vals);
|
||||||
.getRelationClass();
|
|
||||||
try {
|
|
||||||
Constructor<? extends POIXMLDocumentPart> constructor = cls
|
|
||||||
.getDeclaredConstructor(POIXMLDocumentPart.class,
|
|
||||||
PackagePart.class, PackageRelationship.class,
|
|
||||||
XDGFDocument.class);
|
|
||||||
return constructor.newInstance(parent, part, rel, _document);
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
Constructor<? extends POIXMLDocumentPart> constructor = cls
|
|
||||||
.getDeclaredConstructor(PackagePart.class,
|
|
||||||
PackageRelationship.class, XDGFDocument.class);
|
|
||||||
return constructor.newInstance(part, rel, _document);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new POIXMLException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor) {
|
|
||||||
try {
|
|
||||||
Class<? extends POIXMLDocumentPart> cls = descriptor
|
|
||||||
.getRelationClass();
|
|
||||||
Constructor<? extends POIXMLDocumentPart> constructor = cls
|
|
||||||
.getDeclaredConstructor();
|
|
||||||
return constructor.newInstance();
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new POIXMLException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -34,11 +34,22 @@ public class XDGFMasterContents extends XDGFBaseContents {
|
|||||||
|
|
||||||
protected XDGFMaster _master;
|
protected XDGFMaster _master;
|
||||||
|
|
||||||
public XDGFMasterContents(PackagePart part, PackageRelationship rel,
|
/**
|
||||||
XDGFDocument document) {
|
* @since POI 3.14-Beta1
|
||||||
super(part, rel, document);
|
*/
|
||||||
|
public XDGFMasterContents(PackagePart part, XDGFDocument document) {
|
||||||
|
super(part, document);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public XDGFMasterContents(PackagePart part, PackageRelationship rel, XDGFDocument document) {
|
||||||
|
this(part, document);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDocumentRead() {
|
protected void onDocumentRead() {
|
||||||
|
|
||||||
|
@ -46,8 +46,19 @@ public class XDGFMasters extends XDGFXMLDocumentPart {
|
|||||||
// key: id of master
|
// key: id of master
|
||||||
protected Map<Long, XDGFMaster> _masters = new HashMap<Long, XDGFMaster>();
|
protected Map<Long, XDGFMaster> _masters = new HashMap<Long, XDGFMaster>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XDGFMasters(PackagePart part, XDGFDocument document) {
|
||||||
|
super(part, document);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XDGFMasters(PackagePart part, PackageRelationship rel, XDGFDocument document) {
|
public XDGFMasters(PackagePart part, PackageRelationship rel, XDGFDocument document) {
|
||||||
super(part, rel, document);
|
this(part, document);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Internal
|
@Internal
|
||||||
@ -72,16 +83,19 @@ public class XDGFMasters extends XDGFXMLDocumentPart {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create the masters
|
// create the masters
|
||||||
for (POIXMLDocumentPart part: getRelations()) {
|
for (RelationPart rp : getRelationParts()) {
|
||||||
|
POIXMLDocumentPart part = rp.getDocumentPart();
|
||||||
|
|
||||||
String relId = part.getPackageRelationship().getId();
|
String relId = rp.getRelationship().getId();
|
||||||
MasterType settings = masterSettings.get(relId);
|
MasterType settings = masterSettings.get(relId);
|
||||||
|
|
||||||
if (settings == null)
|
if (settings == null) {
|
||||||
throw new POIXMLException("Master relationship for " + relId + " not found");
|
throw new POIXMLException("Master relationship for " + relId + " not found");
|
||||||
|
}
|
||||||
|
|
||||||
if (!(part instanceof XDGFMasterContents))
|
if (!(part instanceof XDGFMasterContents)) {
|
||||||
throw new POIXMLException("Unexpected masters relationship for " + relId + ": " + part);
|
throw new POIXMLException("Unexpected masters relationship for " + relId + ": " + part);
|
||||||
|
}
|
||||||
|
|
||||||
XDGFMasterContents contents = (XDGFMasterContents)part;
|
XDGFMasterContents contents = (XDGFMasterContents)part;
|
||||||
contents.onDocumentRead();
|
contents.onDocumentRead();
|
||||||
|
@ -35,8 +35,19 @@ public class XDGFPageContents extends XDGFBaseContents {
|
|||||||
protected Map<Long, XDGFMaster> _masters = new HashMap<Long, XDGFMaster>();
|
protected Map<Long, XDGFMaster> _masters = new HashMap<Long, XDGFMaster>();
|
||||||
protected XDGFPage _page;
|
protected XDGFPage _page;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XDGFPageContents(PackagePart part, XDGFDocument document) {
|
||||||
|
super(part, document);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XDGFPageContents(PackagePart part, PackageRelationship rel, XDGFDocument document) {
|
public XDGFPageContents(PackagePart part, PackageRelationship rel, XDGFDocument document) {
|
||||||
super(part, rel, document);
|
this(part, document);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -45,8 +45,19 @@ public class XDGFPages extends XDGFXMLDocumentPart {
|
|||||||
// ordered by page number
|
// ordered by page number
|
||||||
List<XDGFPage> _pages = new ArrayList<XDGFPage>();
|
List<XDGFPage> _pages = new ArrayList<XDGFPage>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XDGFPages(PackagePart part, XDGFDocument document) {
|
||||||
|
super(part, document);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XDGFPages(PackagePart part, PackageRelationship rel, XDGFDocument document) {
|
public XDGFPages(PackagePart part, PackageRelationship rel, XDGFDocument document) {
|
||||||
super(part, rel, document);
|
this(part, document);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Internal
|
@Internal
|
||||||
|
@ -65,12 +65,9 @@ public class XDGFRelation extends POIXMLRelation {
|
|||||||
"http://schemas.microsoft.com/visio/2010/relationships/windows",
|
"http://schemas.microsoft.com/visio/2010/relationships/windows",
|
||||||
"/visio/windows.xml", null);
|
"/visio/windows.xml", null);
|
||||||
|
|
||||||
private XDGFRelation(String type, String rel, String defaultName,
|
private XDGFRelation(String type, String rel, String defaultName, Class<? extends XDGFXMLDocumentPart> cls) {
|
||||||
Class<? extends XDGFXMLDocumentPart> cls) {
|
|
||||||
super(type, rel, defaultName, cls);
|
super(type, rel, defaultName, cls);
|
||||||
|
_table.put(rel, this);
|
||||||
if (cls != null && !_table.containsKey(rel))
|
|
||||||
_table.put(rel, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -25,10 +25,20 @@ public class XDGFXMLDocumentPart extends POIXMLDocumentPart {
|
|||||||
|
|
||||||
protected XDGFDocument _document;
|
protected XDGFDocument _document;
|
||||||
|
|
||||||
public XDGFXMLDocumentPart(PackagePart part, PackageRelationship rel,
|
/**
|
||||||
XDGFDocument document) {
|
* @since POI 3.14-Beta1
|
||||||
super(part, rel);
|
*/
|
||||||
|
public XDGFXMLDocumentPart(PackagePart part, XDGFDocument document) {
|
||||||
|
super(part);
|
||||||
_document = document;
|
_document = document;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public XDGFXMLDocumentPart(PackagePart part, PackageRelationship rel, XDGFDocument document) {
|
||||||
|
this(part, document);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,8 +36,6 @@ import org.apache.poi.POIXMLException;
|
|||||||
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePartName;
|
|
||||||
import org.apache.poi.openxml4j.opc.TargetMode;
|
|
||||||
import org.apache.poi.sl.usermodel.MasterSheet;
|
import org.apache.poi.sl.usermodel.MasterSheet;
|
||||||
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
||||||
import org.apache.poi.sl.usermodel.Resources;
|
import org.apache.poi.sl.usermodel.Resources;
|
||||||
@ -132,9 +130,10 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
|
|
||||||
Map<String, XSLFSlideMaster> masterMap = new HashMap<String, XSLFSlideMaster>();
|
Map<String, XSLFSlideMaster> masterMap = new HashMap<String, XSLFSlideMaster>();
|
||||||
Map<String, XSLFSlide> shIdMap = new HashMap<String, XSLFSlide>();
|
Map<String, XSLFSlide> shIdMap = new HashMap<String, XSLFSlide>();
|
||||||
for (POIXMLDocumentPart p : getRelations()) {
|
for (RelationPart rp : getRelationParts()) {
|
||||||
|
POIXMLDocumentPart p = rp.getDocumentPart();
|
||||||
if (p instanceof XSLFSlide) {
|
if (p instanceof XSLFSlide) {
|
||||||
shIdMap.put(p.getPackageRelationship().getId(), (XSLFSlide) p);
|
shIdMap.put(rp.getRelationship().getId(), (XSLFSlide) p);
|
||||||
} else if (p instanceof XSLFSlideMaster) {
|
} else if (p instanceof XSLFSlideMaster) {
|
||||||
masterMap.put(getRelationId(p), (XSLFSlideMaster) p);
|
masterMap.put(getRelationId(p), (XSLFSlideMaster) p);
|
||||||
} else if (p instanceof XSLFTableStyles){
|
} else if (p instanceof XSLFTableStyles){
|
||||||
@ -218,19 +217,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
XSLFSlide slide = (XSLFSlide)createRelationship(
|
RelationPart rp = createRelationship(
|
||||||
XSLFRelation.SLIDE, XSLFFactory.getInstance(), cnt);
|
XSLFRelation.SLIDE, XSLFFactory.getInstance(), cnt, false);
|
||||||
|
XSLFSlide slide = (XSLFSlide)rp.getDocumentPart();
|
||||||
|
|
||||||
CTSlideIdListEntry slideId = slideList.addNewSldId();
|
CTSlideIdListEntry slideId = slideList.addNewSldId();
|
||||||
slideId.setId(slideNumber);
|
slideId.setId(slideNumber);
|
||||||
slideId.setId2(slide.getPackageRelationship().getId());
|
slideId.setId2(rp.getRelationship().getId());
|
||||||
|
|
||||||
layout.copyLayout(slide);
|
layout.copyLayout(slide);
|
||||||
slide.addRelation(layout.getPackageRelationship().getId(), layout);
|
slide.addRelation(null, XSLFRelation.SLIDE_LAYOUT, layout);
|
||||||
|
|
||||||
PackagePartName ppName = layout.getPackagePart().getPartName();
|
|
||||||
slide.getPackagePart().addRelationship(ppName, TargetMode.INTERNAL,
|
|
||||||
layout.getPackageRelationship().getRelationshipType());
|
|
||||||
|
|
||||||
_slides.add(slide);
|
_slides.add(slide);
|
||||||
return slide;
|
return slide;
|
||||||
@ -271,22 +267,13 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
|
|
||||||
Integer slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide);
|
Integer slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide);
|
||||||
|
|
||||||
XSLFNotes notesSlide = (XSLFNotes) createRelationship(XSLFRelation.NOTES, XSLFFactory.getInstance(), slideIndex);
|
// add notes slide to presentation
|
||||||
|
XSLFNotes notesSlide = (XSLFNotes) createRelationship
|
||||||
notesSlide.addRelation(_notesMaster.getPackageRelationship().getId(), _notesMaster);
|
(XSLFRelation.NOTES, XSLFFactory.getInstance(), slideIndex);
|
||||||
PackagePartName notesMasterPackagePartName = _notesMaster.getPackagePart().getPartName();
|
// link slide and notes slide with each other
|
||||||
notesSlide.getPackagePart().addRelationship(notesMasterPackagePartName, TargetMode.INTERNAL,
|
slide.addRelation(null, XSLFRelation.NOTES, notesSlide);
|
||||||
_notesMaster.getPackageRelationship().getRelationshipType());
|
notesSlide.addRelation(null, XSLFRelation.NOTES_MASTER, _notesMaster);
|
||||||
|
notesSlide.addRelation(null, XSLFRelation.SLIDE, slide);
|
||||||
slide.addRelation(notesSlide.getPackageRelationship().getId(), notesSlide);
|
|
||||||
PackagePartName notesSlidesPackagePartName = notesSlide.getPackagePart().getPartName();
|
|
||||||
slide.getPackagePart().addRelationship(notesSlidesPackagePartName, TargetMode.INTERNAL,
|
|
||||||
notesSlide.getPackageRelationship().getRelationshipType());
|
|
||||||
|
|
||||||
notesSlide.addRelation(slide.getPackageRelationship().getId(), slide);
|
|
||||||
PackagePartName slidesPackagePartName = slide.getPackagePart().getPartName();
|
|
||||||
notesSlide.getPackagePart().addRelationship(slidesPackagePartName, TargetMode.INTERNAL,
|
|
||||||
slide.getPackageRelationship().getRelationshipType());
|
|
||||||
|
|
||||||
notesSlide.importContent(_notesMaster);
|
notesSlide.importContent(_notesMaster);
|
||||||
|
|
||||||
@ -297,15 +284,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
* Create a notes master.
|
* Create a notes master.
|
||||||
*/
|
*/
|
||||||
public void createNotesMaster() {
|
public void createNotesMaster() {
|
||||||
|
RelationPart rp = createRelationship
|
||||||
_notesMaster = (XSLFNotesMaster) createRelationship(XSLFRelation.NOTES_MASTER,
|
(XSLFRelation.NOTES_MASTER, XSLFFactory.getInstance(), 1, false);
|
||||||
XSLFFactory.getInstance(), 1);
|
_notesMaster = (XSLFNotesMaster)rp.getDocumentPart();
|
||||||
|
|
||||||
CTNotesMasterIdList notesMasterIdList = _presentation.addNewNotesMasterIdLst();
|
CTNotesMasterIdList notesMasterIdList = _presentation.addNewNotesMasterIdLst();
|
||||||
CTNotesMasterIdListEntry notesMasterId = notesMasterIdList.addNewNotesMasterId();
|
CTNotesMasterIdListEntry notesMasterId = notesMasterIdList.addNewNotesMasterId();
|
||||||
notesMasterId.setId(_notesMaster.getPackageRelationship().getId());
|
notesMasterId.setId(rp.getRelationship().getId());
|
||||||
|
|
||||||
Integer themeIndex = 1;
|
Integer themeIndex = 1;
|
||||||
|
// TODO: check if that list can be replaced by idx = Math.max(idx,themeIdx)
|
||||||
List<Integer> themeIndexList = new ArrayList<Integer>();
|
List<Integer> themeIndexList = new ArrayList<Integer>();
|
||||||
for (POIXMLDocumentPart p : getRelations()) {
|
for (POIXMLDocumentPart p : getRelations()) {
|
||||||
if (p instanceof XSLFTheme) {
|
if (p instanceof XSLFTheme) {
|
||||||
@ -326,14 +314,11 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
XSLFTheme theme = (XSLFTheme) createRelationship(XSLFRelation.THEME,
|
XSLFTheme theme = (XSLFTheme) createRelationship
|
||||||
XSLFFactory.getInstance(), themeIndex);
|
(XSLFRelation.THEME, XSLFFactory.getInstance(), themeIndex);
|
||||||
theme.importTheme(getSlides().get(0).getTheme());
|
theme.importTheme(getSlides().get(0).getTheme());
|
||||||
|
|
||||||
_notesMaster.addRelation(theme.getPackageRelationship().getId(), theme);
|
_notesMaster.addRelation(null, XSLFRelation.THEME, theme);
|
||||||
PackagePartName themePackagePartName = theme.getPackagePart().getPartName();
|
|
||||||
_notesMaster.getPackagePart().addRelationship(themePackagePartName, TargetMode.INTERNAL,
|
|
||||||
theme.getPackageRelationship().getRelationshipType());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -436,7 +421,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
|
|||||||
if (relType == null) {
|
if (relType == null) {
|
||||||
throw new IllegalArgumentException("Picture type "+format+" is not supported.");
|
throw new IllegalArgumentException("Picture type "+format+" is not supported.");
|
||||||
}
|
}
|
||||||
img = (XSLFPictureData) createRelationship(relType, XSLFFactory.getInstance(), imageNumber + 1, true);
|
img = (XSLFPictureData) createRelationship(relType, XSLFFactory.getInstance(), imageNumber + 1, true).getDocumentPart();
|
||||||
img.setIndex(imageNumber);
|
img.setIndex(imageNumber);
|
||||||
_pictures.add(img);
|
_pictures.add(img);
|
||||||
try {
|
try {
|
||||||
|
@ -55,20 +55,35 @@ public final class XSLFChart extends POIXMLDocumentPart {
|
|||||||
*/
|
*/
|
||||||
private CTChart chart;
|
private CTChart chart;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a chart from a package part.
|
* Construct a chart from a package part.
|
||||||
*
|
*
|
||||||
* @param part the package part holding the chart data,
|
* @param part the package part holding the chart data,
|
||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
||||||
* @param rel the package relationship holding this chart,
|
*
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
protected XSLFChart(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
protected XSLFChart(PackagePart part) throws IOException, XmlException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
|
|
||||||
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
|
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
|
||||||
chart = chartSpace.getChart();
|
chart = chartSpace.getChart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a chart from a package part.
|
||||||
|
*
|
||||||
|
* @param part the package part holding the chart data,
|
||||||
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
||||||
|
* @param rel the package relationship holding this chart,
|
||||||
|
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart
|
||||||
|
*
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected XSLFChart(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the underlying CTChartSpace bean, the root element of the Chart part.
|
* Return the underlying CTChartSpace bean, the root element of the Chart part.
|
||||||
|
@ -48,17 +48,31 @@ public class XSLFCommentAuthors extends POIXMLDocumentPart {
|
|||||||
*
|
*
|
||||||
* @param part the package part holding the comment authors data,
|
* @param part the package part holding the comment authors data,
|
||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.commentAuthors+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.commentAuthors+xml</code>
|
||||||
* @param rel the package relationship holding this comment authors,
|
*
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
XSLFCommentAuthors(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
XSLFCommentAuthors(PackagePart part) throws IOException, XmlException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
|
|
||||||
CmAuthorLstDocument doc =
|
CmAuthorLstDocument doc =
|
||||||
CmAuthorLstDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
CmAuthorLstDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
||||||
_authors = doc.getCmAuthorLst();
|
_authors = doc.getCmAuthorLst();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a SpreadsheetML slide authors from a package part
|
||||||
|
*
|
||||||
|
* @param part the package part holding the comment authors data,
|
||||||
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.commentAuthors+xml</code>
|
||||||
|
* @param rel the package relationship holding this comment authors,
|
||||||
|
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors
|
||||||
|
*
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
XSLFCommentAuthors(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public CTCommentAuthorList getCTCommentAuthorsList() {
|
public CTCommentAuthorList getCTCommentAuthorsList() {
|
||||||
return _authors;
|
return _authors;
|
||||||
}
|
}
|
||||||
|
@ -48,17 +48,32 @@ public class XSLFComments extends POIXMLDocumentPart {
|
|||||||
*
|
*
|
||||||
* @param part the package part holding the comments data,
|
* @param part the package part holding the comments data,
|
||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.comments+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.comments+xml</code>
|
||||||
* @param rel the package relationship holding this comments,
|
*
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
XSLFComments(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
XSLFComments(PackagePart part) throws IOException, XmlException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
|
|
||||||
CmLstDocument doc =
|
CmLstDocument doc =
|
||||||
CmLstDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
CmLstDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
||||||
_comments = doc.getCmLst();
|
_comments = doc.getCmLst();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a SpreadsheetML slide comments from a package part
|
||||||
|
*
|
||||||
|
* @param part the package part holding the comments data,
|
||||||
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.comments+xml</code>
|
||||||
|
* @param rel the package relationship holding this comments,
|
||||||
|
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments
|
||||||
|
*
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
XSLFComments(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public CTCommentList getCTCommentsList() {
|
public CTCommentList getCTCommentsList() {
|
||||||
return _comments;
|
return _comments;
|
||||||
}
|
}
|
||||||
|
@ -19,27 +19,17 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
import org.apache.poi.POIXMLException;
|
|
||||||
import org.apache.poi.POIXMLFactory;
|
import org.apache.poi.POIXMLFactory;
|
||||||
import org.apache.poi.POIXMLRelation;
|
import org.apache.poi.POIXMLRelation;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
|
||||||
import org.apache.poi.util.Beta;
|
|
||||||
import org.apache.poi.util.POILogFactory;
|
|
||||||
import org.apache.poi.util.POILogger;
|
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates sub-classes of POIXMLDocumentPart depending on their relationship type
|
* Instantiates sub-classes of POIXMLDocumentPart depending on their relationship type
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
*/
|
||||||
@Beta
|
|
||||||
public final class XSLFFactory extends POIXMLFactory {
|
public final class XSLFFactory extends POIXMLFactory {
|
||||||
private static final POILogger logger = POILogFactory.getLogger(XSLFFactory.class);
|
|
||||||
|
|
||||||
private XSLFFactory(){
|
private XSLFFactory(){
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -50,32 +40,22 @@ public final class XSLFFactory extends POIXMLFactory {
|
|||||||
return inst;
|
return inst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part){
|
protected POIXMLRelation getDescriptor(String relationshipType) {
|
||||||
POIXMLRelation descriptor = XSLFRelation.getInstance(rel.getRelationshipType());
|
return XSLFRelation.getInstance(relationshipType);
|
||||||
if(descriptor == null || descriptor.getRelationClass() == null){
|
|
||||||
logger.log(POILogger.DEBUG, "using default POIXMLDocumentPart for " + rel.getRelationshipType());
|
|
||||||
return new POIXMLDocumentPart(part, rel);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
|
|
||||||
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(PackagePart.class, PackageRelationship.class);
|
|
||||||
return constructor.newInstance(part, rel);
|
|
||||||
} catch (Exception e){
|
|
||||||
throw new POIXMLException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor){
|
protected POIXMLDocumentPart createDocumentPart
|
||||||
try {
|
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
|
||||||
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
|
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
|
||||||
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor();
|
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(classes);
|
||||||
return constructor.newInstance();
|
return constructor.newInstance(values);
|
||||||
} catch (Exception e){
|
|
||||||
throw new POIXMLException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -53,9 +53,11 @@ implements Notes<XSLFShape,XSLFTextParagraph> {
|
|||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.notes+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.notes+xml</code>
|
||||||
* @param rel the package relationship holding this notes,
|
* @param rel the package relationship holding this notes,
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/notes
|
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/notes
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
XSLFNotes(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
XSLFNotes(PackagePart part) throws IOException, XmlException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
|
|
||||||
NotesDocument doc =
|
NotesDocument doc =
|
||||||
NotesDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
NotesDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
||||||
@ -63,6 +65,14 @@ implements Notes<XSLFShape,XSLFTextParagraph> {
|
|||||||
setCommonSlideData(_notes.getCSld());
|
setCommonSlideData(_notes.getCSld());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
XSLFNotes(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
private static CTNotesSlide prototype(){
|
private static CTNotesSlide prototype(){
|
||||||
CTNotesSlide ctNotes = CTNotesSlide.Factory.newInstance();
|
CTNotesSlide ctNotes = CTNotesSlide.Factory.newInstance();
|
||||||
CTCommonSlideData cSld = ctNotes.addNewCSld();
|
CTCommonSlideData cSld = ctNotes.addNewCSld();
|
||||||
|
@ -59,14 +59,25 @@ import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument;
|
|||||||
_slide = prototype();
|
_slide = prototype();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected XSLFNotesMaster(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
/**
|
||||||
super(part, rel);
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
protected XSLFNotesMaster(PackagePart part) throws IOException, XmlException {
|
||||||
|
super(part);
|
||||||
NotesMasterDocument doc =
|
NotesMasterDocument doc =
|
||||||
NotesMasterDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
NotesMasterDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
||||||
_slide = doc.getNotesMaster();
|
_slide = doc.getNotesMaster();
|
||||||
setCommonSlideData(_slide.getCSld());
|
setCommonSlideData(_slide.getCSld());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected XSLFNotesMaster(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
private static CTNotesMaster prototype() {
|
private static CTNotesMaster prototype() {
|
||||||
InputStream is = XSLFNotesMaster.class.getResourceAsStream("notesMaster.xml");
|
InputStream is = XSLFNotesMaster.class.getResourceAsStream("notesMaster.xml");
|
||||||
if (is == null) {
|
if (is == null) {
|
||||||
|
@ -64,15 +64,28 @@ public final class XSLFPictureData extends POIXMLDocumentPart implements Picture
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct XSLFPictureData from a package part
|
||||||
|
*
|
||||||
|
* @param part the package part holding the drawing data
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XSLFPictureData(PackagePart part) {
|
||||||
|
super(part);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct XSLFPictureData from a package part
|
* Construct XSLFPictureData from a package part
|
||||||
*
|
*
|
||||||
* @param part the package part holding the drawing data,
|
* @param part the package part holding the drawing data,
|
||||||
* @param rel the package relationship holding this drawing,
|
* @param rel the package relationship holding this drawing,
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/image
|
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/image
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public XSLFPictureData(PackagePart part, PackageRelationship rel) {
|
public XSLFPictureData(PackagePart part, PackageRelationship rel) {
|
||||||
super(part, rel);
|
this(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -221,7 +221,7 @@ public class XSLFRelation extends POIXMLRelation {
|
|||||||
null,
|
null,
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
|
||||||
null,
|
null,
|
||||||
null
|
XSLFPictureData.class
|
||||||
);
|
);
|
||||||
|
|
||||||
public static final XSLFRelation TABLE_STYLES = new XSLFRelation(
|
public static final XSLFRelation TABLE_STYLES = new XSLFRelation(
|
||||||
@ -233,8 +233,7 @@ public class XSLFRelation extends POIXMLRelation {
|
|||||||
|
|
||||||
private XSLFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) {
|
private XSLFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) {
|
||||||
super(type, rel, defaultName, cls);
|
super(type, rel, defaultName, cls);
|
||||||
|
_table.put(rel, this);
|
||||||
if(cls != null && !_table.containsKey(rel)) _table.put(rel, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -73,8 +73,19 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XSLFSheet(PackagePart part) {
|
||||||
|
super(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XSLFSheet(PackagePart part, PackageRelationship rel){
|
public XSLFSheet(PackagePart part, PackageRelationship rel){
|
||||||
super(part, rel);
|
this(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -212,11 +223,9 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
XSLFPictureData xPictureData = (XSLFPictureData)pictureData;
|
XSLFPictureData xPictureData = (XSLFPictureData)pictureData;
|
||||||
PackagePart pic = xPictureData.getPackagePart();
|
PackagePart pic = xPictureData.getPackagePart();
|
||||||
|
|
||||||
PackageRelationship rel = getPackagePart().addRelationship(
|
RelationPart rp = addRelation(null, XSLFRelation.IMAGES, new XSLFPictureData(pic));
|
||||||
pic.getPartName(), TargetMode.INTERNAL, XSLFRelation.IMAGES.getRelation());
|
|
||||||
addRelation(rel.getId(), new XSLFPictureData(pic, rel));
|
|
||||||
|
|
||||||
XSLFPictureShape sh = getDrawing().createPicture(rel.getId());
|
XSLFPictureShape sh = getDrawing().createPicture(rp.getRelationship().getId());
|
||||||
new DrawPictureShape(sh).resize();
|
new DrawPictureShape(sh).resize();
|
||||||
getShapes().add(sh);
|
getShapes().add(sh);
|
||||||
sh.setParent(this);
|
sh.setParent(this);
|
||||||
@ -550,17 +559,15 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
} catch (InvalidFormatException e){
|
} catch (InvalidFormatException e){
|
||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
}
|
}
|
||||||
XSLFPictureData data = new XSLFPictureData(blipPart, null);
|
XSLFPictureData data = new XSLFPictureData(blipPart);
|
||||||
|
|
||||||
XMLSlideShow ppt = getSlideShow();
|
XMLSlideShow ppt = getSlideShow();
|
||||||
XSLFPictureData pictureData = ppt.addPicture(data.getData(), data.getType());
|
XSLFPictureData pictureData = ppt.addPicture(data.getData(), data.getType());
|
||||||
PackagePart pic = pictureData.getPackagePart();
|
PackagePart pic = pictureData.getPackagePart();
|
||||||
|
|
||||||
PackageRelationship rel = getPackagePart().addRelationship(
|
RelationPart rp = addRelation(blipId, XSLFRelation.IMAGES, new XSLFPictureData(pic));
|
||||||
pic.getPartName(), TargetMode.INTERNAL, blipRel.getRelationshipType());
|
|
||||||
addRelation(rel.getId(), new XSLFPictureData(pic, rel));
|
|
||||||
|
|
||||||
return rel.getId();
|
return rp.getRelationship().getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -66,11 +66,11 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
*
|
*
|
||||||
* @param part the package part holding the slide data,
|
* @param part the package part holding the slide data,
|
||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.slide+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.slide+xml</code>
|
||||||
* @param rel the package relationship holding this slide,
|
*
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
XSLFSlide(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
XSLFSlide(PackagePart part) throws IOException, XmlException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
|
|
||||||
SldDocument doc =
|
SldDocument doc =
|
||||||
SldDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
SldDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
||||||
@ -78,6 +78,14 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
|
|||||||
setCommonSlideData(_slide.getCSld());
|
setCommonSlideData(_slide.getCSld());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
XSLFSlide(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private static CTSlide prototype(){
|
private static CTSlide prototype(){
|
||||||
CTSlide ctSlide = CTSlide.Factory.newInstance();
|
CTSlide ctSlide = CTSlide.Factory.newInstance();
|
||||||
|
@ -44,14 +44,24 @@ implements MasterSheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
_layout = CTSlideLayout.Factory.newInstance();
|
_layout = CTSlideLayout.Factory.newInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSLFSlideLayout(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
/**
|
||||||
super(part, rel);
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XSLFSlideLayout(PackagePart part) throws IOException, XmlException {
|
||||||
|
super(part);
|
||||||
SldLayoutDocument doc =
|
SldLayoutDocument doc =
|
||||||
SldLayoutDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
SldLayoutDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
||||||
_layout = doc.getSldLayout();
|
_layout = doc.getSldLayout();
|
||||||
setCommonSlideData(_layout.getCSld());
|
setCommonSlideData(_layout.getCSld());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public XSLFSlideLayout(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return _layout.getCSld().getName();
|
return _layout.getCSld().getName();
|
||||||
|
@ -69,14 +69,25 @@ import org.openxmlformats.schemas.presentationml.x2006.main.SldMasterDocument;
|
|||||||
_slide = CTSlideMaster.Factory.newInstance();
|
_slide = CTSlideMaster.Factory.newInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected XSLFSlideMaster(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
/**
|
||||||
super(part, rel);
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
protected XSLFSlideMaster(PackagePart part) throws IOException, XmlException {
|
||||||
|
super(part);
|
||||||
SldMasterDocument doc =
|
SldMasterDocument doc =
|
||||||
SldMasterDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
SldMasterDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
||||||
_slide = doc.getSldMaster();
|
_slide = doc.getSldMaster();
|
||||||
setCommonSlideData(_slide.getCSld());
|
setCommonSlideData(_slide.getCSld());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected XSLFSlideMaster(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CTSlideMaster getXmlObject() {
|
public CTSlideMaster getXmlObject() {
|
||||||
return _slide;
|
return _slide;
|
||||||
|
@ -41,8 +41,11 @@ public class XSLFTableStyles extends POIXMLDocumentPart implements Iterable<XSLF
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSLFTableStyles(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
/**
|
||||||
super(part, rel);
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XSLFTableStyles(PackagePart part) throws IOException, XmlException {
|
||||||
|
super(part);
|
||||||
|
|
||||||
_tblStyleLst = CTTableStyleList.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
_tblStyleLst = CTTableStyleList.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
||||||
CTTableStyle[] tblStyleArray = _tblStyleLst.getTblStyleArray();
|
CTTableStyle[] tblStyleArray = _tblStyleLst.getTblStyleArray();
|
||||||
@ -52,6 +55,14 @@ public class XSLFTableStyles extends POIXMLDocumentPart implements Iterable<XSLF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public XSLFTableStyles(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public CTTableStyleList getXmlObject(){
|
public CTTableStyleList getXmlObject(){
|
||||||
return _tblStyleLst;
|
return _tblStyleLst;
|
||||||
}
|
}
|
||||||
|
@ -56,14 +56,25 @@ public class XSLFTheme extends POIXMLDocumentPart {
|
|||||||
_theme = CTOfficeStyleSheet.Factory.newInstance();
|
_theme = CTOfficeStyleSheet.Factory.newInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSLFTheme(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
/**
|
||||||
super(part, rel);
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XSLFTheme(PackagePart part) throws IOException, XmlException {
|
||||||
|
super(part);
|
||||||
ThemeDocument doc =
|
ThemeDocument doc =
|
||||||
ThemeDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
ThemeDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
|
||||||
_theme = doc.getTheme();
|
_theme = doc.getTheme();
|
||||||
initialize();
|
initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public XSLFTheme(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public void importTheme(XSLFTheme theme) {
|
public void importTheme(XSLFTheme theme) {
|
||||||
_theme = theme.getXmlObject();
|
_theme = theme.getXmlObject();
|
||||||
_schemeColors = theme._schemeColors;
|
_schemeColors = theme._schemeColors;
|
||||||
|
@ -114,15 +114,21 @@ public class ReadOnlySharedStringsTable extends DefaultHandler {
|
|||||||
/**
|
/**
|
||||||
* Like POIXMLDocumentPart constructor
|
* Like POIXMLDocumentPart constructor
|
||||||
*
|
*
|
||||||
* @param part
|
* @since POI 3.14-Beta1
|
||||||
* @param rel_ignored
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
*/
|
||||||
public ReadOnlySharedStringsTable(PackagePart part, PackageRelationship rel_ignored)
|
public ReadOnlySharedStringsTable(PackagePart part) throws IOException, SAXException {
|
||||||
throws IOException, SAXException {
|
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public ReadOnlySharedStringsTable(PackagePart part, PackageRelationship rel_ignored)
|
||||||
|
throws IOException, SAXException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read this shared strings table from an XML file.
|
* Read this shared strings table from an XML file.
|
||||||
*
|
*
|
||||||
|
@ -44,11 +44,22 @@ public class CalculationChain extends POIXMLDocumentPart {
|
|||||||
chain = CTCalcChain.Factory.newInstance();
|
chain = CTCalcChain.Factory.newInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public CalculationChain(PackagePart part, PackageRelationship rel) throws IOException {
|
/**
|
||||||
super(part, rel);
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public CalculationChain(PackagePart part) throws IOException {
|
||||||
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public CalculationChain(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public void readFrom(InputStream is) throws IOException {
|
public void readFrom(InputStream is) throws IOException {
|
||||||
try {
|
try {
|
||||||
CalcChainDocument doc = CalcChainDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
CalcChainDocument doc = CalcChainDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
||||||
|
@ -60,11 +60,22 @@ public class CommentsTable extends POIXMLDocumentPart {
|
|||||||
comments.addNewAuthors().addAuthor(DEFAULT_AUTHOR);
|
comments.addNewAuthors().addAuthor(DEFAULT_AUTHOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CommentsTable(PackagePart part, PackageRelationship rel) throws IOException {
|
/**
|
||||||
super(part, rel);
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public CommentsTable(PackagePart part) throws IOException {
|
||||||
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public CommentsTable(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public void readFrom(InputStream is) throws IOException {
|
public void readFrom(InputStream is) throws IOException {
|
||||||
try {
|
try {
|
||||||
CommentsDocument doc = CommentsDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
CommentsDocument doc = CommentsDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
||||||
|
@ -49,11 +49,22 @@ public class ExternalLinksTable extends POIXMLDocumentPart {
|
|||||||
link.addNewExternalBook();
|
link.addNewExternalBook();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExternalLinksTable(PackagePart part, PackageRelationship rel) throws IOException {
|
/**
|
||||||
super(part, rel);
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public ExternalLinksTable(PackagePart part) throws IOException {
|
||||||
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public ExternalLinksTable(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public void readFrom(InputStream is) throws IOException {
|
public void readFrom(InputStream is) throws IOException {
|
||||||
try {
|
try {
|
||||||
ExternalLinkDocument doc = ExternalLinkDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
ExternalLinkDocument doc = ExternalLinkDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
||||||
|
@ -61,10 +61,19 @@ public class MapInfo extends POIXMLDocumentPart {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MapInfo(PackagePart part, PackageRelationship rel)
|
/**
|
||||||
throws IOException {
|
* @since POI 3.14-Beta1
|
||||||
super(part, rel);
|
*/
|
||||||
readFrom(part.getInputStream());
|
public MapInfo(PackagePart part) throws IOException {
|
||||||
|
super(part);
|
||||||
|
readFrom(part.getInputStream());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
public MapInfo(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void readFrom(InputStream is) throws IOException {
|
public void readFrom(InputStream is) throws IOException {
|
||||||
|
@ -103,11 +103,21 @@ public class SharedStringsTable extends POIXMLDocumentPart {
|
|||||||
_sstDoc.addNewSst();
|
_sstDoc.addNewSst();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SharedStringsTable(PackagePart part, PackageRelationship rel) throws IOException {
|
/**
|
||||||
super(part, rel);
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public SharedStringsTable(PackagePart part) throws IOException {
|
||||||
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
public SharedStringsTable(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read this shared strings table from an XML file.
|
* Read this shared strings table from an XML file.
|
||||||
*
|
*
|
||||||
|
@ -55,12 +55,22 @@ public class SingleXmlCells extends POIXMLDocumentPart {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public SingleXmlCells(PackagePart part, PackageRelationship rel)
|
/**
|
||||||
throws IOException {
|
* @since POI 3.14-Beta1
|
||||||
super(part, rel);
|
*/
|
||||||
|
public SingleXmlCells(PackagePart part) throws IOException {
|
||||||
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public SingleXmlCells(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public void readFrom(InputStream is) throws IOException {
|
public void readFrom(InputStream is) throws IOException {
|
||||||
try {
|
try {
|
||||||
SingleXmlCellsDocument doc = SingleXmlCellsDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
SingleXmlCellsDocument doc = SingleXmlCellsDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
||||||
|
@ -138,11 +138,22 @@ public class StylesTable extends POIXMLDocumentPart {
|
|||||||
initialize();
|
initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
public StylesTable(PackagePart part, PackageRelationship rel) throws IOException {
|
/**
|
||||||
super(part, rel);
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public StylesTable(PackagePart part) throws IOException {
|
||||||
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public StylesTable(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public void setWorkbook(XSSFWorkbook wb) {
|
public void setWorkbook(XSSFWorkbook wb) {
|
||||||
this.workbook = wb;
|
this.workbook = wb;
|
||||||
}
|
}
|
||||||
|
@ -76,9 +76,11 @@ public class ThemesTable extends POIXMLDocumentPart {
|
|||||||
* Construct a ThemesTable.
|
* Construct a ThemesTable.
|
||||||
* @param part A PackagePart.
|
* @param part A PackagePart.
|
||||||
* @param rel A PackageRelationship.
|
* @param rel A PackageRelationship.
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
public ThemesTable(PackagePart part, PackageRelationship rel) throws IOException {
|
public ThemesTable(PackagePart part) throws IOException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
theme = ThemeDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS);
|
theme = ThemeDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS);
|
||||||
@ -87,6 +89,14 @@ public class ThemesTable extends POIXMLDocumentPart {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public ThemesTable(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a ThemesTable from an existing ThemeDocument.
|
* Construct a ThemesTable from an existing ThemeDocument.
|
||||||
* @param theme A ThemeDocument.
|
* @param theme A ThemeDocument.
|
||||||
|
@ -95,14 +95,25 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
|
|||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
|
||||||
* @param rel the package relationship holding this chart,
|
* @param rel the package relationship holding this chart,
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart
|
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
protected XSSFChart(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
protected XSSFChart(PackagePart part) throws IOException, XmlException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
|
|
||||||
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
|
chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
|
||||||
chart = chartSpace.getChart();
|
chart = chartSpace.getChart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected XSSFChart(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new CTChartSpace bean.
|
* Construct a new CTChartSpace bean.
|
||||||
* By default, it's just an empty placeholder for chart objects.
|
* By default, it's just an empty placeholder for chart objects.
|
||||||
|
@ -51,8 +51,19 @@ public class XSSFChartSheet extends XSSFSheet {
|
|||||||
|
|
||||||
protected CTChartsheet chartsheet;
|
protected CTChartsheet chartsheet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
protected XSSFChartSheet(PackagePart part) {
|
||||||
|
super(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
protected XSSFChartSheet(PackagePart part, PackageRelationship rel) {
|
protected XSSFChartSheet(PackagePart part, PackageRelationship rel) {
|
||||||
super(part, rel);
|
this(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void read(InputStream is) throws IOException {
|
protected void read(InputStream is) throws IOException {
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.usermodel;
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDialogsheet;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDialogsheet;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHeaderFooter;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHeaderFooter;
|
||||||
@ -33,8 +34,8 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
|
|||||||
public class XSSFDialogsheet extends XSSFSheet implements Sheet{
|
public class XSSFDialogsheet extends XSSFSheet implements Sheet{
|
||||||
protected CTDialogsheet dialogsheet;
|
protected CTDialogsheet dialogsheet;
|
||||||
|
|
||||||
protected XSSFDialogsheet(XSSFSheet sheet) {
|
protected XSSFDialogsheet(XSSFSheet sheet, PackageRelationship rel) {
|
||||||
super(sheet.getPackagePart(), sheet.getPackageRelationship());
|
super(sheet.getPackagePart(), rel);
|
||||||
this.dialogsheet = CTDialogsheet.Factory.newInstance();
|
this.dialogsheet = CTDialogsheet.Factory.newInstance();
|
||||||
this.worksheet = CTWorksheet.Factory.newInstance();
|
this.worksheet = CTWorksheet.Factory.newInstance();
|
||||||
}
|
}
|
||||||
|
@ -28,9 +28,7 @@ import javax.xml.namespace.QName;
|
|||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePartName;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.openxml4j.opc.TargetMode;
|
|
||||||
import org.apache.poi.ss.usermodel.ClientAnchor;
|
import org.apache.poi.ss.usermodel.ClientAnchor;
|
||||||
import org.apache.poi.ss.usermodel.Drawing;
|
import org.apache.poi.ss.usermodel.Drawing;
|
||||||
import org.apache.poi.ss.util.CellAddress;
|
import org.apache.poi.ss.util.CellAddress;
|
||||||
@ -84,15 +82,25 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing {
|
|||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawing+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawing+xml</code>
|
||||||
* @param rel the package relationship holding this drawing,
|
* @param rel the package relationship holding this drawing,
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing
|
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
public XSSFDrawing(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
public XSSFDrawing(PackagePart part) throws IOException, XmlException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
XmlOptions options = new XmlOptions(DEFAULT_XML_OPTIONS);
|
XmlOptions options = new XmlOptions(DEFAULT_XML_OPTIONS);
|
||||||
//Removing root element
|
//Removing root element
|
||||||
options.setLoadReplaceDocumentElement(null);
|
options.setLoadReplaceDocumentElement(null);
|
||||||
drawing = CTDrawing.Factory.parse(part.getInputStream(),options);
|
drawing = CTDrawing.Factory.parse(part.getInputStream(),options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public XSSFDrawing(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new CTDrawing bean. By default, it's just an empty placeholder for drawing objects
|
* Construct a new CTDrawing bean. By default, it's just an empty placeholder for drawing objects
|
||||||
*
|
*
|
||||||
@ -199,9 +207,10 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing {
|
|||||||
int chartNumber = getPackagePart().getPackage().
|
int chartNumber = getPackagePart().getPackage().
|
||||||
getPartsByContentType(XSSFRelation.CHART.getContentType()).size() + 1;
|
getPartsByContentType(XSSFRelation.CHART.getContentType()).size() + 1;
|
||||||
|
|
||||||
XSSFChart chart = (XSSFChart) createRelationship(
|
RelationPart rp = createRelationship(
|
||||||
XSSFRelation.CHART, XSSFFactory.getInstance(), chartNumber);
|
XSSFRelation.CHART, XSSFFactory.getInstance(), chartNumber, false);
|
||||||
String chartRelId = chart.getPackageRelationship().getId();
|
XSSFChart chart = rp.getDocumentPart();
|
||||||
|
String chartRelId = rp.getRelationship().getId();
|
||||||
|
|
||||||
XSSFGraphicFrame frame = createGraphicFrame(anchor);
|
XSSFGraphicFrame frame = createGraphicFrame(anchor);
|
||||||
frame.setChart(chart, chartRelId);
|
frame.setChart(chart, chartRelId);
|
||||||
@ -220,13 +229,13 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing {
|
|||||||
* @param pictureIndex the index of the picture in the workbook collection of pictures,
|
* @param pictureIndex the index of the picture in the workbook collection of pictures,
|
||||||
* {@link org.apache.poi.xssf.usermodel.XSSFWorkbook#getAllPictures()} .
|
* {@link org.apache.poi.xssf.usermodel.XSSFWorkbook#getAllPictures()} .
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("resource")
|
||||||
protected PackageRelationship addPictureReference(int pictureIndex){
|
protected PackageRelationship addPictureReference(int pictureIndex){
|
||||||
XSSFWorkbook wb = (XSSFWorkbook)getParent().getParent();
|
XSSFWorkbook wb = (XSSFWorkbook)getParent().getParent();
|
||||||
XSSFPictureData data = wb.getAllPictures().get(pictureIndex);
|
XSSFPictureData data = wb.getAllPictures().get(pictureIndex);
|
||||||
PackagePartName ppName = data.getPackagePart().getPartName();
|
XSSFPictureData pic = new XSSFPictureData(data.getPackagePart(), null);
|
||||||
PackageRelationship rel = getPackagePart().addRelationship(ppName, TargetMode.INTERNAL, XSSFRelation.IMAGES.getRelation());
|
RelationPart rp = addRelation(null, XSSFRelation.IMAGES, pic);
|
||||||
addRelation(rel.getId(),new XSSFPictureData(data.getPackagePart(), rel));
|
return rp.getRelationship();
|
||||||
return rel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -18,26 +18,17 @@
|
|||||||
package org.apache.poi.xssf.usermodel;
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
import org.apache.poi.POIXMLException;
|
|
||||||
import org.apache.poi.POIXMLFactory;
|
import org.apache.poi.POIXMLFactory;
|
||||||
import org.apache.poi.POIXMLRelation;
|
import org.apache.poi.POIXMLRelation;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
|
||||||
import org.apache.poi.util.POILogFactory;
|
|
||||||
import org.apache.poi.util.POILogger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates sub-classes of POIXMLDocumentPart depending on their relationship type
|
* Instantiates sub-classes of POIXMLDocumentPart depending on their relationship type
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
*/
|
||||||
public final class XSSFFactory extends POIXMLFactory {
|
public final class XSSFFactory extends POIXMLFactory {
|
||||||
private static final POILogger logger = POILogFactory.getLogger(XSSFFactory.class);
|
private XSSFFactory() {
|
||||||
|
|
||||||
private XSSFFactory(){
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final XSSFFactory inst = new XSSFFactory();
|
private static final XSSFFactory inst = new XSSFFactory();
|
||||||
@ -46,32 +37,22 @@ public final class XSSFFactory extends POIXMLFactory {
|
|||||||
return inst;
|
return inst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part){
|
protected POIXMLRelation getDescriptor(String relationshipType) {
|
||||||
POIXMLRelation descriptor = XSSFRelation.getInstance(rel.getRelationshipType());
|
return XSSFRelation.getInstance(relationshipType);
|
||||||
if(descriptor == null || descriptor.getRelationClass() == null){
|
|
||||||
logger.log(POILogger.DEBUG, "using default POIXMLDocumentPart for " + rel.getRelationshipType());
|
|
||||||
return new POIXMLDocumentPart(part, rel);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
|
|
||||||
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(PackagePart.class, PackageRelationship.class);
|
|
||||||
return constructor.newInstance(part, rel);
|
|
||||||
} catch (Exception e){
|
|
||||||
throw new POIXMLException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor){
|
protected POIXMLDocumentPart createDocumentPart
|
||||||
try {
|
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
|
||||||
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
|
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
|
||||||
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor();
|
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(classes);
|
||||||
return constructor.newInstance();
|
return constructor.newInstance(values);
|
||||||
} catch (Exception e){
|
|
||||||
throw new POIXMLException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
|
import org.apache.poi.POIXMLDocumentPart.RelationPart;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
import org.apache.poi.xssf.model.MapInfo;
|
import org.apache.poi.xssf.model.MapInfo;
|
||||||
import org.apache.poi.xssf.model.SingleXmlCells;
|
import org.apache.poi.xssf.model.SingleXmlCells;
|
||||||
@ -97,15 +99,11 @@ public class XSSFMap {
|
|||||||
* @return the list of all Tables that provide a map rule to this mapping
|
* @return the list of all Tables that provide a map rule to this mapping
|
||||||
*/
|
*/
|
||||||
public List<XSSFTable> getRelatedTables() {
|
public List<XSSFTable> getRelatedTables() {
|
||||||
|
|
||||||
List<XSSFTable> tables = new ArrayList<XSSFTable>();
|
List<XSSFTable> tables = new ArrayList<XSSFTable>();
|
||||||
int sheetNumber = mapInfo.getWorkbook().getNumberOfSheets();
|
for (Sheet sheet : mapInfo.getWorkbook()) {
|
||||||
|
for (RelationPart rp : ((XSSFSheet)sheet).getRelationParts()) {
|
||||||
for (int i = 0; i < sheetNumber; i++) {
|
if (rp.getRelationship().getRelationshipType().equals(XSSFRelation.TABLE.getRelation())) {
|
||||||
XSSFSheet sheet = mapInfo.getWorkbook().getSheetAt(i);
|
XSSFTable table = rp.getDocumentPart();
|
||||||
for (POIXMLDocumentPart p : sheet.getRelations()) {
|
|
||||||
if (p.getPackageRelationship().getRelationshipType().equals(XSSFRelation.TABLE.getRelation())) {
|
|
||||||
XSSFTable table = (XSSFTable) p;
|
|
||||||
if (table.mapsTo(ctMap.getID())) {
|
if (table.mapsTo(ctMap.getID())) {
|
||||||
tables.add(table);
|
tables.add(table);
|
||||||
}
|
}
|
||||||
|
@ -68,9 +68,19 @@ public class XSSFPictureData extends POIXMLDocumentPart implements PictureData {
|
|||||||
* @param part the package part holding the drawing data,
|
* @param part the package part holding the drawing data,
|
||||||
* @param rel the package relationship holding this drawing,
|
* @param rel the package relationship holding this drawing,
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/image
|
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/image
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
|
protected XSSFPictureData(PackagePart part) {
|
||||||
|
super(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
protected XSSFPictureData(PackagePart part, PackageRelationship rel) {
|
protected XSSFPictureData(PackagePart part, PackageRelationship rel) {
|
||||||
super(part, rel);
|
this(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -51,13 +51,23 @@ public class XSSFPivotCache extends POIXMLDocumentPart {
|
|||||||
*
|
*
|
||||||
* @param part - The package part that holds xml data representing this pivot cache definition.
|
* @param part - The package part that holds xml data representing this pivot cache definition.
|
||||||
* @param rel - the relationship of the given package part in the underlying OPC package
|
* @param rel - the relationship of the given package part in the underlying OPC package
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
protected XSSFPivotCache(PackagePart part, PackageRelationship rel) throws IOException {
|
protected XSSFPivotCache(PackagePart part) throws IOException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected XSSFPivotCache(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
protected void readFrom(InputStream is) throws IOException {
|
protected void readFrom(InputStream is) throws IOException {
|
||||||
try {
|
try {
|
||||||
|
@ -58,13 +58,23 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
|
|||||||
*
|
*
|
||||||
* @param part - The package part that holds xml data representing this pivot cache definition.
|
* @param part - The package part that holds xml data representing this pivot cache definition.
|
||||||
* @param rel - the relationship of the given package part in the underlying OPC package
|
* @param rel - the relationship of the given package part in the underlying OPC package
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
protected XSSFPivotCacheDefinition(PackagePart part, PackageRelationship rel) throws IOException {
|
protected XSSFPivotCacheDefinition(PackagePart part) throws IOException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected XSSFPivotCacheDefinition(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
public void readFrom(InputStream is) throws IOException {
|
public void readFrom(InputStream is) throws IOException {
|
||||||
try {
|
try {
|
||||||
|
@ -48,13 +48,23 @@ public class XSSFPivotCacheRecords extends POIXMLDocumentPart {
|
|||||||
*
|
*
|
||||||
* @param part - The package part that holds xml data representing this pivot cache records.
|
* @param part - The package part that holds xml data representing this pivot cache records.
|
||||||
* @param rel - the relationship of the given package part in the underlying OPC package
|
* @param rel - the relationship of the given package part in the underlying OPC package
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
protected XSSFPivotCacheRecords(PackagePart part, PackageRelationship rel) throws IOException {
|
protected XSSFPivotCacheRecords(PackagePart part) throws IOException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected XSSFPivotCacheRecords(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
protected void readFrom(InputStream is) throws IOException {
|
protected void readFrom(InputStream is) throws IOException {
|
||||||
try {
|
try {
|
||||||
|
@ -88,13 +88,23 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
|
|||||||
*
|
*
|
||||||
* @param part - The package part that holds xml data representing this pivot table.
|
* @param part - The package part that holds xml data representing this pivot table.
|
||||||
* @param rel - the relationship of the given package part in the underlying OPC package
|
* @param rel - the relationship of the given package part in the underlying OPC package
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
protected XSSFPivotTable(PackagePart part, PackageRelationship rel) throws IOException {
|
protected XSSFPivotTable(PackagePart part) throws IOException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected XSSFPivotTable(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
public void readFrom(InputStream is) throws IOException {
|
public void readFrom(InputStream is) throws IOException {
|
||||||
try {
|
try {
|
||||||
|
@ -347,8 +347,7 @@ public final class XSSFRelation extends POIXMLRelation {
|
|||||||
|
|
||||||
private XSSFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) {
|
private XSSFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) {
|
||||||
super(type, rel, defaultName, cls);
|
super(type, rel, defaultName, cls);
|
||||||
|
_table.put(rel, this);
|
||||||
if(cls != null && !_table.containsKey(rel)) _table.put(rel, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -162,16 +162,26 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an XSSFSheet representing the given package part and relationship.
|
* Creates an XSSFSheet representing the given package part and relationship.
|
||||||
* Should only be called by XSSFWorkbook when reading in an exisiting file.
|
* Should only be called by XSSFWorkbook when reading in an existing file.
|
||||||
*
|
*
|
||||||
* @param part - The package part that holds xml data represenring this sheet.
|
* @param part - The package part that holds xml data representing this sheet.
|
||||||
* @param rel - the relationship of the given package part in the underlying OPC package
|
* @param rel - the relationship of the given package part in the underlying OPC package
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
protected XSSFSheet(PackagePart part, PackageRelationship rel) {
|
protected XSSFSheet(PackagePart part) {
|
||||||
super(part, rel);
|
super(part);
|
||||||
dataValidationHelper = new XSSFDataValidationHelper(this);
|
dataValidationHelper = new XSSFDataValidationHelper(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected XSSFSheet(PackagePart part, PackageRelationship rel) {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the parent XSSFWorkbook
|
* Returns the parent XSSFWorkbook
|
||||||
*
|
*
|
||||||
@ -204,12 +214,13 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
initRows(worksheet);
|
initRows(worksheet);
|
||||||
columnHelper = new ColumnHelper(worksheet);
|
columnHelper = new ColumnHelper(worksheet);
|
||||||
// Look for bits we're interested in
|
// Look for bits we're interested in
|
||||||
for(POIXMLDocumentPart p : getRelations()){
|
for(RelationPart rp : getRelationParts()){
|
||||||
|
POIXMLDocumentPart p = rp.getDocumentPart();
|
||||||
if(p instanceof CommentsTable) {
|
if(p instanceof CommentsTable) {
|
||||||
sheetComments = (CommentsTable)p;
|
sheetComments = (CommentsTable)p;
|
||||||
}
|
}
|
||||||
if(p instanceof XSSFTable) {
|
if(p instanceof XSSFTable) {
|
||||||
tables.put( p.getPackageRelationship().getId(), (XSSFTable)p );
|
tables.put( rp.getRelationship().getId(), (XSSFTable)p );
|
||||||
}
|
}
|
||||||
if(p instanceof XSSFPivotTable) {
|
if(p instanceof XSSFPivotTable) {
|
||||||
getWorkbook().getPivotTables().add((XSSFPivotTable) p);
|
getWorkbook().getPivotTables().add((XSSFPivotTable) p);
|
||||||
@ -449,10 +460,11 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
CTDrawing ctDrawing = getCTDrawing();
|
CTDrawing ctDrawing = getCTDrawing();
|
||||||
if (ctDrawing != null) {
|
if (ctDrawing != null) {
|
||||||
// Search the referenced drawing in the list of the sheet's relations
|
// Search the referenced drawing in the list of the sheet's relations
|
||||||
for (POIXMLDocumentPart p : getRelations()){
|
for (RelationPart rp : getRelationParts()){
|
||||||
|
POIXMLDocumentPart p = rp.getDocumentPart();
|
||||||
if (p instanceof XSSFDrawing) {
|
if (p instanceof XSSFDrawing) {
|
||||||
XSSFDrawing dr = (XSSFDrawing)p;
|
XSSFDrawing dr = (XSSFDrawing)p;
|
||||||
String drId = dr.getPackageRelationship().getId();
|
String drId = rp.getRelationship().getId();
|
||||||
if (drId.equals(ctDrawing.getId())){
|
if (drId.equals(ctDrawing.getId())){
|
||||||
return dr;
|
return dr;
|
||||||
}
|
}
|
||||||
@ -478,8 +490,9 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
|
|
||||||
//drawingNumber = #drawings.size() + 1
|
//drawingNumber = #drawings.size() + 1
|
||||||
int drawingNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.DRAWINGS.getContentType()).size() + 1;
|
int drawingNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.DRAWINGS.getContentType()).size() + 1;
|
||||||
XSSFDrawing drawing = (XSSFDrawing)createRelationship(XSSFRelation.DRAWINGS, XSSFFactory.getInstance(), drawingNumber);
|
RelationPart rp = createRelationship(XSSFRelation.DRAWINGS, XSSFFactory.getInstance(), drawingNumber, false);
|
||||||
String relId = drawing.getPackageRelationship().getId();
|
XSSFDrawing drawing = rp.getDocumentPart();
|
||||||
|
String relId = rp.getRelationship().getId();
|
||||||
|
|
||||||
//add CT_Drawing element which indicates that this sheet contains drawing components built on the drawingML platform.
|
//add CT_Drawing element which indicates that this sheet contains drawing components built on the drawingML platform.
|
||||||
//The relationship Id references the part containing the drawingML definitions.
|
//The relationship Id references the part containing the drawingML definitions.
|
||||||
@ -504,8 +517,9 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
if(autoCreate) {
|
if(autoCreate) {
|
||||||
//drawingNumber = #drawings.size() + 1
|
//drawingNumber = #drawings.size() + 1
|
||||||
int drawingNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.VML_DRAWINGS.getContentType()).size() + 1;
|
int drawingNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.VML_DRAWINGS.getContentType()).size() + 1;
|
||||||
drawing = (XSSFVMLDrawing)createRelationship(XSSFRelation.VML_DRAWINGS, XSSFFactory.getInstance(), drawingNumber);
|
RelationPart rp = createRelationship(XSSFRelation.VML_DRAWINGS, XSSFFactory.getInstance(), drawingNumber, false);
|
||||||
String relId = drawing.getPackageRelationship().getId();
|
drawing = rp.getDocumentPart();
|
||||||
|
String relId = rp.getRelationship().getId();
|
||||||
|
|
||||||
//add CTLegacyDrawing element which indicates that this sheet contains drawing components built on the drawingML platform.
|
//add CTLegacyDrawing element which indicates that this sheet contains drawing components built on the drawingML platform.
|
||||||
//The relationship Id references the part containing the drawing definitions.
|
//The relationship Id references the part containing the drawing definitions.
|
||||||
@ -514,10 +528,11 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//search the referenced drawing in the list of the sheet's relations
|
//search the referenced drawing in the list of the sheet's relations
|
||||||
for(POIXMLDocumentPart p : getRelations()){
|
for (RelationPart rp : getRelationParts()){
|
||||||
|
POIXMLDocumentPart p = rp.getDocumentPart();
|
||||||
if(p instanceof XSSFVMLDrawing) {
|
if(p instanceof XSSFVMLDrawing) {
|
||||||
XSSFVMLDrawing dr = (XSSFVMLDrawing)p;
|
XSSFVMLDrawing dr = (XSSFVMLDrawing)p;
|
||||||
String drId = dr.getPackageRelationship().getId();
|
String drId = rp.getRelationship().getId();
|
||||||
if(drId.equals(ctDrawing.getId())){
|
if(drId.equals(ctDrawing.getId())){
|
||||||
drawing = dr;
|
drawing = dr;
|
||||||
break;
|
break;
|
||||||
@ -3695,6 +3710,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("resource")
|
||||||
@Override
|
@Override
|
||||||
public XSSFAutoFilter setAutoFilter(CellRangeAddress range) {
|
public XSSFAutoFilter setAutoFilter(CellRangeAddress range) {
|
||||||
CTAutoFilter af = worksheet.getAutoFilter();
|
CTAutoFilter af = worksheet.getAutoFilter();
|
||||||
@ -3735,8 +3751,9 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
// Table numbers need to be unique in the file, not just
|
// Table numbers need to be unique in the file, not just
|
||||||
// unique within the sheet. Find the next one
|
// unique within the sheet. Find the next one
|
||||||
int tableNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.TABLE.getContentType()).size() + 1;
|
int tableNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.TABLE.getContentType()).size() + 1;
|
||||||
XSSFTable table = (XSSFTable)createRelationship(XSSFRelation.TABLE, XSSFFactory.getInstance(), tableNumber);
|
RelationPart rp = createRelationship(XSSFRelation.TABLE, XSSFFactory.getInstance(), tableNumber, false);
|
||||||
tbl.setId(table.getPackageRelationship().getId());
|
XSSFTable table = rp.getDocumentPart();
|
||||||
|
tbl.setId(rp.getRelationship().getId());
|
||||||
|
|
||||||
tables.put(tbl.getId(), table);
|
tables.put(tbl.getId(), table);
|
||||||
|
|
||||||
@ -3933,6 +3950,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||||||
* including: pivotCacheDefinition, pivotCacheRecords
|
* including: pivotCacheDefinition, pivotCacheRecords
|
||||||
* @return returns a pivotTable
|
* @return returns a pivotTable
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("resource")
|
||||||
@Beta
|
@Beta
|
||||||
private XSSFPivotTable createPivotTable() {
|
private XSSFPivotTable createPivotTable() {
|
||||||
XSSFWorkbook wb = getWorkbook();
|
XSSFWorkbook wb = getWorkbook();
|
||||||
|
@ -62,12 +62,22 @@ public class XSSFTable extends POIXMLDocumentPart {
|
|||||||
ctTable = CTTable.Factory.newInstance();
|
ctTable = CTTable.Factory.newInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSSFTable(PackagePart part, PackageRelationship rel)
|
/**
|
||||||
throws IOException {
|
* @since POI 3.14-Beta1
|
||||||
super(part, rel);
|
*/
|
||||||
|
public XSSFTable(PackagePart part) throws IOException {
|
||||||
|
super(part);
|
||||||
readFrom(part.getInputStream());
|
readFrom(part.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public XSSFTable(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
public void readFrom(InputStream is) throws IOException {
|
public void readFrom(InputStream is) throws IOException {
|
||||||
try {
|
try {
|
||||||
TableDocument doc = TableDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
TableDocument doc = TableDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
||||||
|
@ -35,9 +35,19 @@ public class XSSFVBAPart extends POIXMLDocumentPart {
|
|||||||
*
|
*
|
||||||
* @param part the package part holding the VBA data,
|
* @param part the package part holding the VBA data,
|
||||||
* @param rel the package relationship holding this part
|
* @param rel the package relationship holding this part
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
|
protected XSSFVBAPart(PackagePart part) {
|
||||||
|
super(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
protected XSSFVBAPart(PackagePart part, PackageRelationship rel) {
|
protected XSSFVBAPart(PackagePart part, PackageRelationship rel) {
|
||||||
super(part, rel);
|
this(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -110,12 +110,21 @@ public final class XSSFVMLDrawing extends POIXMLDocumentPart {
|
|||||||
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawing+xml</code>
|
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawing+xml</code>
|
||||||
* @param rel the package relationship holding this drawing,
|
* @param rel the package relationship holding this drawing,
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing
|
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
protected XSSFVMLDrawing(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
protected XSSFVMLDrawing(PackagePart part) throws IOException, XmlException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
read(getPackagePart().getInputStream());
|
read(getPackagePart().getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected XSSFVMLDrawing(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
protected void read(InputStream is) throws IOException, XmlException {
|
protected void read(InputStream is) throws IOException, XmlException {
|
||||||
XmlObject root = XmlObject.Factory.parse(
|
XmlObject root = XmlObject.Factory.parse(
|
||||||
|
@ -338,17 +338,18 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
ThemesTable theme = null;
|
ThemesTable theme = null;
|
||||||
Map<String, XSSFSheet> shIdMap = new HashMap<String, XSSFSheet>();
|
Map<String, XSSFSheet> shIdMap = new HashMap<String, XSSFSheet>();
|
||||||
Map<String, ExternalLinksTable> elIdMap = new HashMap<String, ExternalLinksTable>();
|
Map<String, ExternalLinksTable> elIdMap = new HashMap<String, ExternalLinksTable>();
|
||||||
for(POIXMLDocumentPart p : getRelations()){
|
for(RelationPart rp : getRelationParts()){
|
||||||
|
POIXMLDocumentPart p = rp.getDocumentPart();
|
||||||
if(p instanceof SharedStringsTable) sharedStringSource = (SharedStringsTable)p;
|
if(p instanceof SharedStringsTable) sharedStringSource = (SharedStringsTable)p;
|
||||||
else if(p instanceof StylesTable) stylesSource = (StylesTable)p;
|
else if(p instanceof StylesTable) stylesSource = (StylesTable)p;
|
||||||
else if(p instanceof ThemesTable) theme = (ThemesTable)p;
|
else if(p instanceof ThemesTable) theme = (ThemesTable)p;
|
||||||
else if(p instanceof CalculationChain) calcChain = (CalculationChain)p;
|
else if(p instanceof CalculationChain) calcChain = (CalculationChain)p;
|
||||||
else if(p instanceof MapInfo) mapInfo = (MapInfo)p;
|
else if(p instanceof MapInfo) mapInfo = (MapInfo)p;
|
||||||
else if (p instanceof XSSFSheet) {
|
else if (p instanceof XSSFSheet) {
|
||||||
shIdMap.put(p.getPackageRelationship().getId(), (XSSFSheet)p);
|
shIdMap.put(rp.getRelationship().getId(), (XSSFSheet)p);
|
||||||
}
|
}
|
||||||
else if (p instanceof ExternalLinksTable) {
|
else if (p instanceof ExternalLinksTable) {
|
||||||
elIdMap.put(p.getPackageRelationship().getId(), (ExternalLinksTable)p);
|
elIdMap.put(rp.getRelationship().getId(), (ExternalLinksTable)p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
boolean packageReadOnly = (getPackage().getPackageAccess() == PackageAccess.READ);
|
boolean packageReadOnly = (getPackage().getPackageAccess() == PackageAccess.READ);
|
||||||
@ -492,7 +493,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
@Override
|
@Override
|
||||||
public int addPicture(byte[] pictureData, int format) {
|
public int addPicture(byte[] pictureData, int format) {
|
||||||
int imageNumber = getAllPictures().size() + 1;
|
int imageNumber = getAllPictures().size() + 1;
|
||||||
XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true);
|
XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true).getDocumentPart();
|
||||||
try {
|
try {
|
||||||
OutputStream out = img.getPackagePart().getOutputStream();
|
OutputStream out = img.getPackagePart().getOutputStream();
|
||||||
out.write(pictureData);
|
out.write(pictureData);
|
||||||
@ -521,7 +522,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
*/
|
*/
|
||||||
public int addPicture(InputStream is, int format) throws IOException {
|
public int addPicture(InputStream is, int format) throws IOException {
|
||||||
int imageNumber = getAllPictures().size() + 1;
|
int imageNumber = getAllPictures().size() + 1;
|
||||||
XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true);
|
XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true).getDocumentPart();
|
||||||
OutputStream out = img.getPackagePart().getOutputStream();
|
OutputStream out = img.getPackagePart().getOutputStream();
|
||||||
IOUtils.copy(is, out);
|
IOUtils.copy(is, out);
|
||||||
out.close();
|
out.close();
|
||||||
@ -546,6 +547,34 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
String clonedName = getUniqueSheetName(srcName);
|
String clonedName = getUniqueSheetName(srcName);
|
||||||
|
|
||||||
XSSFSheet clonedSheet = createSheet(clonedName);
|
XSSFSheet clonedSheet = createSheet(clonedName);
|
||||||
|
|
||||||
|
// copy sheet's relations
|
||||||
|
List<RelationPart> rels = srcSheet.getRelationParts();
|
||||||
|
// if the sheet being cloned has a drawing then rememebr it and re-create it too
|
||||||
|
XSSFDrawing dg = null;
|
||||||
|
for(RelationPart rp : rels) {
|
||||||
|
POIXMLDocumentPart r = rp.getDocumentPart();
|
||||||
|
// do not copy the drawing relationship, it will be re-created
|
||||||
|
if(r instanceof XSSFDrawing) {
|
||||||
|
dg = (XSSFDrawing)r;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
addRelation(rp, clonedSheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
for(PackageRelationship pr : srcSheet.getPackagePart().getRelationships()) {
|
||||||
|
if (pr.getTargetMode() == TargetMode.EXTERNAL) {
|
||||||
|
clonedSheet.getPackagePart().addExternalRelationship
|
||||||
|
(pr.getTargetURI().toASCIIString(), pr.getRelationshipType(), pr.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (InvalidFormatException e) {
|
||||||
|
throw new POIXMLException("Failed to clone sheet", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
srcSheet.write(out);
|
srcSheet.write(out);
|
||||||
@ -565,23 +594,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
|
|
||||||
clonedSheet.setSelected(false);
|
clonedSheet.setSelected(false);
|
||||||
|
|
||||||
// copy sheet's relations
|
|
||||||
List<POIXMLDocumentPart> rels = srcSheet.getRelations();
|
|
||||||
// if the sheet being cloned has a drawing then rememebr it and re-create tpoo
|
|
||||||
XSSFDrawing dg = null;
|
|
||||||
for(POIXMLDocumentPart r : rels) {
|
|
||||||
// do not copy the drawing relationship, it will be re-created
|
|
||||||
if(r instanceof XSSFDrawing) {
|
|
||||||
dg = (XSSFDrawing)r;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
PackageRelationship rel = r.getPackageRelationship();
|
|
||||||
clonedSheet.getPackagePart().addRelationship(
|
|
||||||
rel.getTargetURI(), rel.getTargetMode(),rel.getRelationshipType());
|
|
||||||
clonedSheet.addRelation(rel.getId(), r);
|
|
||||||
}
|
|
||||||
|
|
||||||
// clone the sheet drawing alongs with its relationships
|
// clone the sheet drawing alongs with its relationships
|
||||||
if (dg != null) {
|
if (dg != null) {
|
||||||
if(ct.isSetDrawing()) {
|
if(ct.isSetDrawing()) {
|
||||||
@ -596,21 +608,32 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
clonedDg = clonedSheet.createDrawingPatriarch();
|
clonedDg = clonedSheet.createDrawingPatriarch();
|
||||||
|
|
||||||
// Clone drawing relations
|
// Clone drawing relations
|
||||||
List<POIXMLDocumentPart> srcRels = srcSheet.createDrawingPatriarch().getRelations();
|
List<RelationPart> srcRels = srcSheet.createDrawingPatriarch().getRelationParts();
|
||||||
for (POIXMLDocumentPart rel : srcRels) {
|
for (RelationPart rp : srcRels) {
|
||||||
PackageRelationship relation = rel.getPackageRelationship();
|
addRelation(rp, clonedDg);
|
||||||
|
|
||||||
clonedDg.addRelation(relation.getId(), rel);
|
|
||||||
|
|
||||||
clonedDg
|
|
||||||
.getPackagePart()
|
|
||||||
.addRelationship(relation.getTargetURI(), relation.getTargetMode(),
|
|
||||||
relation.getRelationshipType(), relation.getId());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return clonedSheet;
|
return clonedSheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 3.14-Beta1
|
||||||
|
*/
|
||||||
|
private static void addRelation(RelationPart rp, POIXMLDocumentPart target) {
|
||||||
|
PackageRelationship rel = rp.getRelationship();
|
||||||
|
if (rel.getTargetMode() == TargetMode.EXTERNAL) {
|
||||||
|
target.getPackagePart().addRelationship(
|
||||||
|
rel.getTargetURI(), rel.getTargetMode(), rel.getRelationshipType(), rel.getId());
|
||||||
|
} else {
|
||||||
|
XSSFRelation xssfRel = XSSFRelation.getInstance(rel.getRelationshipType());
|
||||||
|
if (xssfRel == null) {
|
||||||
|
// Don't copy all relations blindly, but only the ones we know about
|
||||||
|
throw new POIXMLException("Can't clone sheet - unknown relation type found: "+rel.getRelationshipType());
|
||||||
|
}
|
||||||
|
target.addRelation(rel.getId(), xssfRel, rp.getDocumentPart());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate a valid sheet name based on the existing one. Used when cloning sheets.
|
* Generate a valid sheet name based on the existing one. Used when cloning sheets.
|
||||||
*
|
*
|
||||||
@ -794,18 +817,21 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
XSSFSheet wrapper = (XSSFSheet)createRelationship(XSSFRelation.WORKSHEET, XSSFFactory.getInstance(), sheetNumber);
|
RelationPart rp = createRelationship(XSSFRelation.WORKSHEET, XSSFFactory.getInstance(), sheetNumber, false);
|
||||||
|
XSSFSheet wrapper = rp.getDocumentPart();
|
||||||
wrapper.sheet = sheet;
|
wrapper.sheet = sheet;
|
||||||
sheet.setId(wrapper.getPackageRelationship().getId());
|
sheet.setId(rp.getRelationship().getId());
|
||||||
sheet.setSheetId(sheetNumber);
|
sheet.setSheetId(sheetNumber);
|
||||||
if(sheets.size() == 0) wrapper.setSelected(true);
|
if (sheets.isEmpty()) wrapper.setSelected(true);
|
||||||
sheets.add(wrapper);
|
sheets.add(wrapper);
|
||||||
return wrapper;
|
return wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected XSSFDialogsheet createDialogsheet(String sheetname, CTDialogsheet dialogsheet) {
|
protected XSSFDialogsheet createDialogsheet(String sheetname, CTDialogsheet dialogsheet) {
|
||||||
XSSFSheet sheet = createSheet(sheetname);
|
XSSFSheet sheet = createSheet(sheetname);
|
||||||
return new XSSFDialogsheet(sheet);
|
String sheetRelId = getRelationId(sheet);
|
||||||
|
PackageRelationship pr = getPackagePart().getRelationship(sheetRelId);
|
||||||
|
return new XSSFDialogsheet(sheet, pr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private CTSheet addSheet(String sheetname) {
|
private CTSheet addSheet(String sheetname) {
|
||||||
|
@ -20,10 +20,9 @@ import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
|
import org.apache.poi.POIXMLDocumentPart.RelationPart;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||||
@ -221,11 +220,9 @@ public class XWPFHeaderFooterPolicy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private int getRelationIndex(XWPFRelation relation) {
|
private int getRelationIndex(XWPFRelation relation) {
|
||||||
List<POIXMLDocumentPart> relations = doc.getRelations();
|
|
||||||
int i = 1;
|
int i = 1;
|
||||||
for (Iterator<POIXMLDocumentPart> it = relations.iterator(); it.hasNext(); ) {
|
for (RelationPart rp : doc.getRelationParts()) {
|
||||||
POIXMLDocumentPart item = it.next();
|
if (rp.getRelationship().getRelationshipType().equals(relation.getRelation())) {
|
||||||
if (item.getPackageRelationship().getRelationshipType().equals(relation.getRelation())) {
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -287,17 +284,16 @@ public class XWPFHeaderFooterPolicy {
|
|||||||
private void setFooterReference(Enum type, XWPFHeaderFooter wrapper) {
|
private void setFooterReference(Enum type, XWPFHeaderFooter wrapper) {
|
||||||
CTHdrFtrRef ref = doc.getDocument().getBody().getSectPr().addNewFooterReference();
|
CTHdrFtrRef ref = doc.getDocument().getBody().getSectPr().addNewFooterReference();
|
||||||
ref.setType(type);
|
ref.setType(type);
|
||||||
ref.setId(wrapper.getPackageRelationship().getId());
|
ref.setId(doc.getRelationId(wrapper));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void setHeaderReference(Enum type, XWPFHeaderFooter wrapper) {
|
private void setHeaderReference(Enum type, XWPFHeaderFooter wrapper) {
|
||||||
CTHdrFtrRef ref = doc.getDocument().getBody().getSectPr().addNewHeaderReference();
|
CTHdrFtrRef ref = doc.getDocument().getBody().getSectPr().addNewHeaderReference();
|
||||||
ref.setType(type);
|
ref.setType(type);
|
||||||
ref.setId(wrapper.getPackageRelationship().getId());
|
ref.setId(doc.getRelationId(wrapper));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public XWPFHeader getFirstPageHeader() {
|
public XWPFHeader getFirstPageHeader() {
|
||||||
return firstPageHeader;
|
return firstPageHeader;
|
||||||
}
|
}
|
||||||
|
@ -193,8 +193,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
headerFooterPolicy = new XWPFHeaderFooterPolicy(this);
|
headerFooterPolicy = new XWPFHeaderFooterPolicy(this);
|
||||||
|
|
||||||
// Create for each XML-part in the Package a PartClass
|
// Create for each XML-part in the Package a PartClass
|
||||||
for (POIXMLDocumentPart p : getRelations()) {
|
for (RelationPart rp : getRelationParts()) {
|
||||||
String relation = p.getPackageRelationship().getRelationshipType();
|
POIXMLDocumentPart p = rp.getDocumentPart();
|
||||||
|
String relation = rp.getRelationship().getRelationshipType();
|
||||||
if (relation.equals(XWPFRelation.STYLES.getRelation())) {
|
if (relation.equals(XWPFRelation.STYLES.getRelation())) {
|
||||||
this.styles = (XWPFStyles) p;
|
this.styles = (XWPFStyles) p;
|
||||||
this.styles.onDocumentRead();
|
this.styles.onDocumentRead();
|
||||||
@ -257,8 +258,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initFootnotes() throws XmlException, IOException {
|
private void initFootnotes() throws XmlException, IOException {
|
||||||
for (POIXMLDocumentPart p : getRelations()) {
|
for (RelationPart rp : getRelationParts()) {
|
||||||
String relation = p.getPackageRelationship().getRelationshipType();
|
POIXMLDocumentPart p = rp.getDocumentPart();
|
||||||
|
String relation = rp.getRelationship().getRelationshipType();
|
||||||
if (relation.equals(XWPFRelation.FOOTNOTE.getRelation())) {
|
if (relation.equals(XWPFRelation.FOOTNOTE.getRelation())) {
|
||||||
this.footnotes = (XWPFFootnotes) p;
|
this.footnotes = (XWPFFootnotes) p;
|
||||||
this.footnotes.onDocumentRead();
|
this.footnotes.onDocumentRead();
|
||||||
@ -723,11 +725,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
* @return i
|
* @return i
|
||||||
*/
|
*/
|
||||||
private int getRelationIndex(XWPFRelation relation) {
|
private int getRelationIndex(XWPFRelation relation) {
|
||||||
List<POIXMLDocumentPart> relations = getRelations();
|
|
||||||
int i = 1;
|
int i = 1;
|
||||||
for (Iterator<POIXMLDocumentPart> it = relations.iterator(); it.hasNext(); ) {
|
for (RelationPart rp : getRelationParts()) {
|
||||||
POIXMLDocumentPart item = it.next();
|
if (rp.getRelationship().getRelationshipType().equals(relation.getRelation())) {
|
||||||
if (item.getPackageRelationship().getRelationshipType().equals(relation.getRelation())) {
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1313,16 +1313,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
|||||||
* relationship to the already existing part and update
|
* relationship to the already existing part and update
|
||||||
* POIXMLDocumentPart data.
|
* POIXMLDocumentPart data.
|
||||||
*/
|
*/
|
||||||
PackagePart picDataPart = xwpfPicData.getPackagePart();
|
|
||||||
// TODO add support for TargetMode.EXTERNAL relations.
|
// TODO add support for TargetMode.EXTERNAL relations.
|
||||||
TargetMode targetMode = TargetMode.INTERNAL;
|
RelationPart rp = addRelation(null, XWPFRelation.IMAGES, xwpfPicData);
|
||||||
PackagePartName partName = picDataPart.getPartName();
|
return rp.getRelationship().getId();
|
||||||
String relation = relDesc.getRelation();
|
|
||||||
PackageRelationship relShip = getPackagePart().addRelationship(partName, targetMode, relation);
|
|
||||||
String id = relShip.getId();
|
|
||||||
addRelation(id, xwpfPicData);
|
|
||||||
pictures.add(xwpfPicData);
|
|
||||||
return id;
|
|
||||||
} else {
|
} else {
|
||||||
/* Part already existed, get relation id and return it */
|
/* Part already existed, get relation id and return it */
|
||||||
return getRelationId(xwpfPicData);
|
return getRelationId(xwpfPicData);
|
||||||
|
@ -18,63 +18,42 @@
|
|||||||
package org.apache.poi.xwpf.usermodel;
|
package org.apache.poi.xwpf.usermodel;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
import org.apache.poi.POIXMLException;
|
|
||||||
import org.apache.poi.POIXMLFactory;
|
import org.apache.poi.POIXMLFactory;
|
||||||
import org.apache.poi.POIXMLRelation;
|
import org.apache.poi.POIXMLRelation;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
|
||||||
import org.apache.poi.util.POILogFactory;
|
|
||||||
import org.apache.poi.util.POILogger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Yegor Kozlov
|
* Instantiates sub-classes of POIXMLDocumentPart depending on their relationship type
|
||||||
*/
|
*/
|
||||||
public final class XWPFFactory extends POIXMLFactory {
|
public final class XWPFFactory extends POIXMLFactory {
|
||||||
|
|
||||||
private static final POILogger logger = POILogFactory.getLogger(XWPFFactory.class);
|
|
||||||
private static final XWPFFactory inst = new XWPFFactory();
|
|
||||||
|
|
||||||
private XWPFFactory() {
|
private XWPFFactory() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final XWPFFactory inst = new XWPFFactory();
|
||||||
|
|
||||||
public static XWPFFactory getInstance() {
|
public static XWPFFactory getInstance() {
|
||||||
return inst;
|
return inst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part) {
|
protected POIXMLRelation getDescriptor(String relationshipType) {
|
||||||
POIXMLRelation descriptor = XWPFRelation.getInstance(rel.getRelationshipType());
|
return XWPFRelation.getInstance(relationshipType);
|
||||||
if (descriptor == null || descriptor.getRelationClass() == null) {
|
|
||||||
logger.log(POILogger.DEBUG, "using default POIXMLDocumentPart for " + rel.getRelationshipType());
|
|
||||||
return new POIXMLDocumentPart(part, rel);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
|
|
||||||
try {
|
|
||||||
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(POIXMLDocumentPart.class, PackagePart.class, PackageRelationship.class);
|
|
||||||
return constructor.newInstance(parent, part, rel);
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(PackagePart.class, PackageRelationship.class);
|
|
||||||
return constructor.newInstance(part, rel);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new POIXMLException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor) {
|
protected POIXMLDocumentPart createDocumentPart
|
||||||
try {
|
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
|
||||||
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
|
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
|
||||||
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor();
|
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(classes);
|
||||||
return constructor.newInstance();
|
return constructor.newInstance(values);
|
||||||
} catch (Exception e) {
|
|
||||||
throw new POIXMLException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -67,8 +67,19 @@ public class XWPFFooter extends XWPFHeaderFooter {
|
|||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XWPFFooter(POIXMLDocumentPart parent, PackagePart part) throws IOException {
|
||||||
|
super(parent, part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XWPFFooter(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) throws IOException {
|
public XWPFFooter(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
super(parent, part, rel);
|
this(parent, part);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,7 +99,7 @@ public class XWPFFooter extends XWPFHeaderFooter {
|
|||||||
protected void onDocumentRead() throws IOException {
|
protected void onDocumentRead() throws IOException {
|
||||||
super.onDocumentRead();
|
super.onDocumentRead();
|
||||||
FtrDocument ftrDocument = null;
|
FtrDocument ftrDocument = null;
|
||||||
InputStream is;
|
InputStream is = null;
|
||||||
try {
|
try {
|
||||||
is = getPackagePart().getInputStream();
|
is = getPackagePart().getInputStream();
|
||||||
ftrDocument = FtrDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
ftrDocument = FtrDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
||||||
@ -117,6 +128,10 @@ public class XWPFFooter extends XWPFHeaderFooter {
|
|||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
|
} finally {
|
||||||
|
if (is != null) {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,9 +51,19 @@ public class XWPFFootnotes extends POIXMLDocumentPart {
|
|||||||
*
|
*
|
||||||
* @param part the package part holding the data of the footnotes,
|
* @param part the package part holding the data of the footnotes,
|
||||||
* @param rel the package relationship of type "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes"
|
* @param rel the package relationship of type "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes"
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
|
public XWPFFootnotes(PackagePart part) throws IOException, OpenXML4JException {
|
||||||
|
super(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XWPFFootnotes(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
|
public XWPFFootnotes(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
|
||||||
super(part, rel);
|
this(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -68,12 +78,17 @@ public class XWPFFootnotes extends POIXMLDocumentPart {
|
|||||||
@Override
|
@Override
|
||||||
protected void onDocumentRead() throws IOException {
|
protected void onDocumentRead() throws IOException {
|
||||||
FootnotesDocument notesDoc;
|
FootnotesDocument notesDoc;
|
||||||
|
InputStream is = null;
|
||||||
try {
|
try {
|
||||||
InputStream is = getPackagePart().getInputStream();
|
is = getPackagePart().getInputStream();
|
||||||
notesDoc = FootnotesDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
notesDoc = FootnotesDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
||||||
ctFootnotes = notesDoc.getFootnotes();
|
ctFootnotes = notesDoc.getFootnotes();
|
||||||
} catch (XmlException e) {
|
} catch (XmlException e) {
|
||||||
throw new POIXMLException();
|
throw new POIXMLException();
|
||||||
|
} finally {
|
||||||
|
if (is != null) {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find our footnotes
|
// Find our footnotes
|
||||||
|
@ -47,8 +47,19 @@ public class XWPFHeader extends XWPFHeaderFooter {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XWPFHeader(POIXMLDocumentPart parent, PackagePart part) throws IOException {
|
||||||
|
super(parent, part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XWPFHeader(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) throws IOException {
|
public XWPFHeader(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
super(parent, part, rel);
|
this(parent, part);
|
||||||
}
|
}
|
||||||
|
|
||||||
public XWPFHeader(XWPFDocument doc, CTHdrFtr hdrFtr) {
|
public XWPFHeader(XWPFDocument doc, CTHdrFtr hdrFtr) {
|
||||||
@ -91,7 +102,7 @@ public class XWPFHeader extends XWPFHeaderFooter {
|
|||||||
protected void onDocumentRead() throws IOException {
|
protected void onDocumentRead() throws IOException {
|
||||||
super.onDocumentRead();
|
super.onDocumentRead();
|
||||||
HdrDocument hdrDocument = null;
|
HdrDocument hdrDocument = null;
|
||||||
InputStream is;
|
InputStream is = null;
|
||||||
try {
|
try {
|
||||||
is = getPackagePart().getInputStream();
|
is = getPackagePart().getInputStream();
|
||||||
hdrDocument = HdrDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
hdrDocument = HdrDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
||||||
@ -120,6 +131,10 @@ public class XWPFHeader extends XWPFHeaderFooter {
|
|||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
} catch (XmlException e) {
|
} catch (XmlException e) {
|
||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
|
} finally {
|
||||||
|
if (is != null) {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,9 +28,7 @@ import org.apache.poi.POIXMLException;
|
|||||||
import org.apache.poi.POIXMLRelation;
|
import org.apache.poi.POIXMLRelation;
|
||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePartName;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.openxml4j.opc.TargetMode;
|
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
import org.apache.xmlbeans.XmlCursor;
|
import org.apache.xmlbeans.XmlCursor;
|
||||||
@ -68,8 +66,11 @@ public abstract class XWPFHeaderFooter extends POIXMLDocumentPart implements IBo
|
|||||||
readHdrFtr();
|
readHdrFtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
public XWPFHeaderFooter(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) throws IOException {
|
/**
|
||||||
super(parent, part, rel);
|
* @since by POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XWPFHeaderFooter(POIXMLDocumentPart parent, PackagePart part) throws IOException {
|
||||||
|
super(parent, part);
|
||||||
this.document = (XWPFDocument) getParent();
|
this.document = (XWPFDocument) getParent();
|
||||||
|
|
||||||
if (this.document == null) {
|
if (this.document == null) {
|
||||||
@ -77,6 +78,14 @@ public abstract class XWPFHeaderFooter extends POIXMLDocumentPart implements IBo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public XWPFHeaderFooter(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
|
this(parent, part);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDocumentRead() throws IOException {
|
protected void onDocumentRead() throws IOException {
|
||||||
for (POIXMLDocumentPart poixmlDocumentPart : getRelations()) {
|
for (POIXMLDocumentPart poixmlDocumentPart : getRelations()) {
|
||||||
@ -271,16 +280,10 @@ public abstract class XWPFHeaderFooter extends POIXMLDocumentPart implements IBo
|
|||||||
* relationship to the already existing part and update
|
* relationship to the already existing part and update
|
||||||
* POIXMLDocumentPart data.
|
* POIXMLDocumentPart data.
|
||||||
*/
|
*/
|
||||||
PackagePart picDataPart = xwpfPicData.getPackagePart();
|
|
||||||
// TODO add support for TargetMode.EXTERNAL relations.
|
// TODO add support for TargetMode.EXTERNAL relations.
|
||||||
TargetMode targetMode = TargetMode.INTERNAL;
|
RelationPart rp = addRelation(null, XWPFRelation.IMAGES, xwpfPicData);
|
||||||
PackagePartName partName = picDataPart.getPartName();
|
|
||||||
String relation = relDesc.getRelation();
|
|
||||||
PackageRelationship relShip = getPackagePart().addRelationship(partName, targetMode, relation);
|
|
||||||
String id = relShip.getId();
|
|
||||||
addRelation(id, xwpfPicData);
|
|
||||||
pictures.add(xwpfPicData);
|
pictures.add(xwpfPicData);
|
||||||
return id;
|
return rp.getRelationship().getId();
|
||||||
} else {
|
} else {
|
||||||
/* Part already existed, get relation id and return it */
|
/* Part already existed, get relation id and return it */
|
||||||
return getRelationId(xwpfPicData);
|
return getRelationId(xwpfPicData);
|
||||||
|
@ -50,12 +50,22 @@ public class XWPFNumbering extends POIXMLDocumentPart {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* create a new styles object with an existing document
|
* create a new styles object with an existing document
|
||||||
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
public XWPFNumbering(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
|
public XWPFNumbering(PackagePart part) throws IOException, OpenXML4JException {
|
||||||
super(part, rel);
|
super(part);
|
||||||
isNew = true;
|
isNew = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public XWPFNumbering(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
|
||||||
|
this(part);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create a new XWPFNumbering object for use in a new document
|
* create a new XWPFNumbering object for use in a new document
|
||||||
*/
|
*/
|
||||||
@ -86,6 +96,8 @@ public class XWPFNumbering extends POIXMLDocumentPart {
|
|||||||
isNew = false;
|
isNew = false;
|
||||||
} catch (XmlException e) {
|
} catch (XmlException e) {
|
||||||
throw new POIXMLException();
|
throw new POIXMLException();
|
||||||
|
} finally {
|
||||||
|
is.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,11 +72,19 @@ public class XWPFPictureData extends POIXMLDocumentPart {
|
|||||||
* Construct XWPFPictureData from a package part
|
* Construct XWPFPictureData from a package part
|
||||||
*
|
*
|
||||||
* @param part the package part holding the drawing data,
|
* @param part the package part holding the drawing data,
|
||||||
* @param rel the package relationship holding this drawing,
|
*
|
||||||
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/image
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
|
public XWPFPictureData(PackagePart part) {
|
||||||
|
super(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XWPFPictureData(PackagePart part, PackageRelationship rel) {
|
public XWPFPictureData(PackagePart part, PackageRelationship rel) {
|
||||||
super(part, rel);
|
this(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -208,13 +208,12 @@ public final class XWPFRelation extends POIXMLRelation {
|
|||||||
null,
|
null,
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
|
||||||
null,
|
null,
|
||||||
null
|
XWPFPictureData.class
|
||||||
);
|
);
|
||||||
|
|
||||||
private XWPFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) {
|
private XWPFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) {
|
||||||
super(type, rel, defaultName, cls);
|
super(type, rel, defaultName, cls);
|
||||||
|
_table.put(rel, this);
|
||||||
if (cls != null && !_table.containsKey(rel)) _table.put(rel, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -997,7 +997,7 @@ public class XWPFRun implements ISDTContents, IRunElement, CharacterRun {
|
|||||||
|
|
||||||
CTBlipFillProperties blipFill = pic.addNewBlipFill();
|
CTBlipFillProperties blipFill = pic.addNewBlipFill();
|
||||||
CTBlip blip = blipFill.addNewBlip();
|
CTBlip blip = blipFill.addNewBlip();
|
||||||
blip.setEmbed(picData.getPackageRelationship().getId());
|
blip.setEmbed(parent.getDocument().getRelationId(picData));
|
||||||
blipFill.addNewStretch().addNewFillRect();
|
blipFill.addNewStretch().addNewFillRect();
|
||||||
|
|
||||||
CTShapeProperties spPr = pic.addNewSpPr();
|
CTShapeProperties spPr = pic.addNewSpPr();
|
||||||
|
@ -49,8 +49,19 @@ public class XWPFSettings extends POIXMLDocumentPart {
|
|||||||
|
|
||||||
private CTSettings ctSettings;
|
private CTSettings ctSettings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
|
public XWPFSettings(PackagePart part) throws IOException {
|
||||||
|
super(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XWPFSettings(PackagePart part, PackageRelationship rel) throws IOException {
|
public XWPFSettings(PackagePart part, PackageRelationship rel) throws IOException {
|
||||||
super(part, rel);
|
this(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
public XWPFSettings() {
|
public XWPFSettings() {
|
||||||
|
@ -62,10 +62,19 @@ public class XWPFStyles extends POIXMLDocumentPart {
|
|||||||
* Construct XWPFStyles from a package part
|
* Construct XWPFStyles from a package part
|
||||||
*
|
*
|
||||||
* @param part the package part holding the data of the styles,
|
* @param part the package part holding the data of the styles,
|
||||||
* @param rel the package relationship of type "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"
|
*
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
*/
|
*/
|
||||||
|
public XWPFStyles(PackagePart part) throws IOException, OpenXML4JException {
|
||||||
|
super(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public XWPFStyles(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
|
public XWPFStyles(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
|
||||||
super(part, rel);
|
this(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -80,13 +89,15 @@ public class XWPFStyles extends POIXMLDocumentPart {
|
|||||||
@Override
|
@Override
|
||||||
protected void onDocumentRead() throws IOException {
|
protected void onDocumentRead() throws IOException {
|
||||||
StylesDocument stylesDoc;
|
StylesDocument stylesDoc;
|
||||||
|
InputStream is = getPackagePart().getInputStream();
|
||||||
try {
|
try {
|
||||||
InputStream is = getPackagePart().getInputStream();
|
|
||||||
stylesDoc = StylesDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
stylesDoc = StylesDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
|
||||||
setStyles(stylesDoc.getStyles());
|
setStyles(stylesDoc.getStyles());
|
||||||
latentStyles = new XWPFLatentStyles(ctStyles.getLatentStyles(), this);
|
latentStyles = new XWPFLatentStyles(ctStyles.getLatentStyles(), this);
|
||||||
} catch (XmlException e) {
|
} catch (XmlException e) {
|
||||||
throw new POIXMLException("Unable to read styles", e);
|
throw new POIXMLException("Unable to read styles", e);
|
||||||
|
} finally {
|
||||||
|
is.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ import static org.junit.Assert.assertSame;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -34,7 +35,6 @@ import java.util.List;
|
|||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
|
import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
|
||||||
import org.apache.poi.util.PackageHelper;
|
import org.apache.poi.util.PackageHelper;
|
||||||
import org.apache.poi.util.TempFile;
|
import org.apache.poi.util.TempFile;
|
||||||
@ -71,14 +71,18 @@ public final class TestPOIXMLDocument {
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
protected POIXMLRelation getDescriptor(String relationshipType) {
|
||||||
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part){
|
return null;
|
||||||
return new POIXMLDocumentPart(part, rel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.14-Beta1
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor){
|
protected POIXMLDocumentPart createDocumentPart
|
||||||
throw new RuntimeException("not supported");
|
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
|
||||||
|
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,25 +25,20 @@ import static org.junit.Assert.fail;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Rectangle;
|
|
||||||
import java.awt.RenderingHints;
|
import java.awt.RenderingHints;
|
||||||
import java.awt.geom.AffineTransform;
|
import java.awt.geom.AffineTransform;
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
import org.apache.poi.POIDataSamples;
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
|
import org.apache.poi.POIXMLDocumentPart.RelationPart;
|
||||||
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
||||||
import org.apache.poi.util.IOUtils;
|
|
||||||
import org.apache.poi.xslf.usermodel.DrawingParagraph;
|
import org.apache.poi.xslf.usermodel.DrawingParagraph;
|
||||||
import org.apache.poi.xslf.usermodel.DrawingTextBody;
|
import org.apache.poi.xslf.usermodel.DrawingTextBody;
|
||||||
import org.apache.poi.xslf.usermodel.XMLSlideShow;
|
import org.apache.poi.xslf.usermodel.XMLSlideShow;
|
||||||
@ -109,7 +104,7 @@ public class TestXSLFBugs {
|
|||||||
XSLFSlide slide = ss.getSlides().get(0);
|
XSLFSlide slide = ss.getSlides().get(0);
|
||||||
|
|
||||||
// Check the relations from this
|
// Check the relations from this
|
||||||
List<POIXMLDocumentPart> rels = slide.getRelations();
|
Collection<RelationPart> rels = slide.getRelationParts();
|
||||||
|
|
||||||
// Should have 6 relations:
|
// Should have 6 relations:
|
||||||
// 1 external hyperlink (skipped from list)
|
// 1 external hyperlink (skipped from list)
|
||||||
@ -118,10 +113,10 @@ public class TestXSLFBugs {
|
|||||||
assertEquals(5, rels.size());
|
assertEquals(5, rels.size());
|
||||||
int layouts = 0;
|
int layouts = 0;
|
||||||
int hyperlinks = 0;
|
int hyperlinks = 0;
|
||||||
for(POIXMLDocumentPart p : rels) {
|
for(RelationPart p : rels) {
|
||||||
if(p.getPackageRelationship().getRelationshipType().equals(XSLFRelation.HYPERLINK.getRelation())) {
|
if(p.getRelationship().getRelationshipType().equals(XSLFRelation.HYPERLINK.getRelation())) {
|
||||||
hyperlinks++;
|
hyperlinks++;
|
||||||
} else if(p instanceof XSLFSlideLayout) {
|
} else if(p.getDocumentPart() instanceof XSLFSlideLayout) {
|
||||||
layouts++;
|
layouts++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,9 +124,9 @@ public class TestXSLFBugs {
|
|||||||
assertEquals(4, hyperlinks);
|
assertEquals(4, hyperlinks);
|
||||||
|
|
||||||
// Hyperlinks should all be to #_ftn1 or #ftnref1
|
// Hyperlinks should all be to #_ftn1 or #ftnref1
|
||||||
for(POIXMLDocumentPart p : rels) {
|
for(RelationPart p : rels) {
|
||||||
if(p.getPackageRelationship().getRelationshipType().equals(XSLFRelation.HYPERLINK.getRelation())) {
|
if(p.getRelationship().getRelationshipType().equals(XSLFRelation.HYPERLINK.getRelation())) {
|
||||||
URI target = p.getPackageRelationship().getTargetURI();
|
URI target = p.getRelationship().getTargetURI();
|
||||||
|
|
||||||
if(target.getFragment().equals("_ftn1") ||
|
if(target.getFragment().equals("_ftn1") ||
|
||||||
target.getFragment().equals("_ftnref1")) {
|
target.getFragment().equals("_ftnref1")) {
|
||||||
@ -150,7 +145,6 @@ public class TestXSLFBugs {
|
|||||||
* rID2 -> slide3.xml
|
* rID2 -> slide3.xml
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
@Ignore
|
|
||||||
public void bug54916() throws Exception {
|
public void bug54916() throws Exception {
|
||||||
XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("OverlappingRelations.pptx");
|
XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("OverlappingRelations.pptx");
|
||||||
XSLFSlide slide;
|
XSLFSlide slide;
|
||||||
|
@ -44,6 +44,7 @@ import java.util.TreeMap;
|
|||||||
import org.apache.poi.EncryptedDocumentException;
|
import org.apache.poi.EncryptedDocumentException;
|
||||||
import org.apache.poi.POIDataSamples;
|
import org.apache.poi.POIDataSamples;
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
|
import org.apache.poi.POIXMLDocumentPart.RelationPart;
|
||||||
import org.apache.poi.POIXMLException;
|
import org.apache.poi.POIXMLException;
|
||||||
import org.apache.poi.POIXMLProperties;
|
import org.apache.poi.POIXMLProperties;
|
||||||
import org.apache.poi.hssf.HSSFTestDataSamples;
|
import org.apache.poi.hssf.HSSFTestDataSamples;
|
||||||
@ -55,6 +56,7 @@ import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
|||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
import org.apache.poi.openxml4j.opc.PackageAccess;
|
import org.apache.poi.openxml4j.opc.PackageAccess;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
|
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
|
||||||
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
||||||
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
|
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
|
||||||
@ -221,9 +223,9 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
|
|||||||
assertEquals(1, wb1.getNumberOfSheets());
|
assertEquals(1, wb1.getNumberOfSheets());
|
||||||
XSSFSheet sh = wb1.getSheetAt(0);
|
XSSFSheet sh = wb1.getSheetAt(0);
|
||||||
XSSFDrawing drawing = sh.createDrawingPatriarch();
|
XSSFDrawing drawing = sh.createDrawingPatriarch();
|
||||||
List<POIXMLDocumentPart> rels = drawing.getRelations();
|
List<RelationPart> rels = drawing.getRelationParts();
|
||||||
assertEquals(1, rels.size());
|
assertEquals(1, rels.size());
|
||||||
assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
|
assertEquals("Sheet1!A1", rels.get(0).getRelationship().getTargetURI().getFragment());
|
||||||
|
|
||||||
// And again, just to be sure
|
// And again, just to be sure
|
||||||
XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
|
XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
|
||||||
@ -231,9 +233,9 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
|
|||||||
assertEquals(1, wb2.getNumberOfSheets());
|
assertEquals(1, wb2.getNumberOfSheets());
|
||||||
sh = wb2.getSheetAt(0);
|
sh = wb2.getSheetAt(0);
|
||||||
drawing = sh.createDrawingPatriarch();
|
drawing = sh.createDrawingPatriarch();
|
||||||
rels = drawing.getRelations();
|
rels = drawing.getRelationParts();
|
||||||
assertEquals(1, rels.size());
|
assertEquals(1, rels.size());
|
||||||
assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
|
assertEquals("Sheet1!A1", rels.get(0).getRelationship().getTargetURI().getFragment());
|
||||||
wb2.close();
|
wb2.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1262,12 +1264,20 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
|
|||||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51470.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51470.xlsx");
|
||||||
XSSFSheet sh0 = wb.getSheetAt(0);
|
XSSFSheet sh0 = wb.getSheetAt(0);
|
||||||
XSSFSheet sh1 = wb.cloneSheet(0);
|
XSSFSheet sh1 = wb.cloneSheet(0);
|
||||||
List<POIXMLDocumentPart> rels0 = sh0.getRelations();
|
List<RelationPart> rels0 = sh0.getRelationParts();
|
||||||
List<POIXMLDocumentPart> rels1 = sh1.getRelations();
|
List<RelationPart> rels1 = sh1.getRelationParts();
|
||||||
assertEquals(1, rels0.size());
|
assertEquals(1, rels0.size());
|
||||||
assertEquals(1, rels1.size());
|
assertEquals(1, rels1.size());
|
||||||
|
|
||||||
assertEquals(rels0.get(0).getPackageRelationship(), rels1.get(0).getPackageRelationship());
|
PackageRelationship pr0 = rels0.get(0).getRelationship();
|
||||||
|
PackageRelationship pr1 = rels1.get(0).getRelationship();
|
||||||
|
|
||||||
|
assertEquals(pr0.getTargetMode(), pr1.getTargetMode());
|
||||||
|
assertEquals(pr0.getTargetURI(), pr1.getTargetURI());
|
||||||
|
POIXMLDocumentPart doc0 = rels0.get(0).getDocumentPart();
|
||||||
|
POIXMLDocumentPart doc1 = rels1.get(0).getDocumentPart();
|
||||||
|
|
||||||
|
assertEquals(doc0, doc1);
|
||||||
wb.close();
|
wb.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ import java.io.IOException;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
|
import org.apache.poi.POIXMLDocumentPart.RelationPart;
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
import org.apache.poi.ss.usermodel.ClientAnchor;
|
import org.apache.poi.ss.usermodel.ClientAnchor;
|
||||||
import org.apache.poi.ss.usermodel.FontUnderline;
|
import org.apache.poi.ss.usermodel.FontUnderline;
|
||||||
@ -44,14 +45,15 @@ public class TestXSSFDrawing {
|
|||||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx");
|
||||||
XSSFSheet sheet = wb.getSheetAt(0);
|
XSSFSheet sheet = wb.getSheetAt(0);
|
||||||
//the sheet has one relationship and it is XSSFDrawing
|
//the sheet has one relationship and it is XSSFDrawing
|
||||||
List<POIXMLDocumentPart> rels = sheet.getRelations();
|
List<RelationPart> rels = sheet.getRelationParts();
|
||||||
assertEquals(1, rels.size());
|
assertEquals(1, rels.size());
|
||||||
assertTrue(rels.get(0) instanceof XSSFDrawing);
|
RelationPart rp = rels.get(0);
|
||||||
|
assertTrue(rp.getDocumentPart() instanceof XSSFDrawing);
|
||||||
|
|
||||||
XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
|
XSSFDrawing drawing = (XSSFDrawing)rp.getDocumentPart();
|
||||||
//sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
|
//sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
|
||||||
assertSame(drawing, sheet.createDrawingPatriarch());
|
assertSame(drawing, sheet.createDrawingPatriarch());
|
||||||
String drawingId = drawing.getPackageRelationship().getId();
|
String drawingId = rp.getRelationship().getId();
|
||||||
|
|
||||||
//there should be a relation to this drawing in the worksheet
|
//there should be a relation to this drawing in the worksheet
|
||||||
assertTrue(sheet.getCTWorksheet().isSetDrawing());
|
assertTrue(sheet.getCTWorksheet().isSetDrawing());
|
||||||
@ -82,12 +84,13 @@ public class TestXSSFDrawing {
|
|||||||
XSSFDrawing dr2 = sheet.createDrawingPatriarch();
|
XSSFDrawing dr2 = sheet.createDrawingPatriarch();
|
||||||
assertSame(dr1, dr2);
|
assertSame(dr1, dr2);
|
||||||
|
|
||||||
List<POIXMLDocumentPart> rels = sheet.getRelations();
|
List<RelationPart> rels = sheet.getRelationParts();
|
||||||
assertEquals(1, rels.size());
|
assertEquals(1, rels.size());
|
||||||
assertTrue(rels.get(0) instanceof XSSFDrawing);
|
RelationPart rp = rels.get(0);
|
||||||
|
assertTrue(rp.getDocumentPart() instanceof XSSFDrawing);
|
||||||
|
|
||||||
XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
|
XSSFDrawing drawing = rp.getDocumentPart();
|
||||||
String drawingId = drawing.getPackageRelationship().getId();
|
String drawingId = rp.getRelationship().getId();
|
||||||
|
|
||||||
//there should be a relation to this drawing in the worksheet
|
//there should be a relation to this drawing in the worksheet
|
||||||
assertTrue(sheet.getCTWorksheet().isSetDrawing());
|
assertTrue(sheet.getCTWorksheet().isSetDrawing());
|
||||||
@ -509,14 +512,15 @@ public class TestXSSFDrawing {
|
|||||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx");
|
||||||
XSSFSheet sheet = wb.getSheetAt(0);
|
XSSFSheet sheet = wb.getSheetAt(0);
|
||||||
//the sheet has one relationship and it is XSSFDrawing
|
//the sheet has one relationship and it is XSSFDrawing
|
||||||
List<POIXMLDocumentPart> rels = sheet.getRelations();
|
List<RelationPart> rels = sheet.getRelationParts();
|
||||||
assertEquals(1, rels.size());
|
assertEquals(1, rels.size());
|
||||||
assertTrue(rels.get(0) instanceof XSSFDrawing);
|
RelationPart rp = rels.get(0);
|
||||||
|
assertTrue(rp.getDocumentPart() instanceof XSSFDrawing);
|
||||||
|
|
||||||
XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
|
XSSFDrawing drawing = rp.getDocumentPart();
|
||||||
//sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
|
//sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
|
||||||
assertSame(drawing, sheet.createDrawingPatriarch());
|
assertSame(drawing, sheet.createDrawingPatriarch());
|
||||||
String drawingId = drawing.getPackageRelationship().getId();
|
String drawingId = rp.getRelationship().getId();
|
||||||
|
|
||||||
//there should be a relation to this drawing in the worksheet
|
//there should be a relation to this drawing in the worksheet
|
||||||
assertTrue(sheet.getCTWorksheet().isSetDrawing());
|
assertTrue(sheet.getCTWorksheet().isSetDrawing());
|
||||||
@ -543,16 +547,17 @@ public class TestXSSFDrawing {
|
|||||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithTextBox.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithTextBox.xlsx");
|
||||||
XSSFSheet sheet = wb.getSheetAt(0);
|
XSSFSheet sheet = wb.getSheetAt(0);
|
||||||
//the sheet has one relationship and it is XSSFDrawing
|
//the sheet has one relationship and it is XSSFDrawing
|
||||||
List<POIXMLDocumentPart> rels = sheet.getRelations();
|
List<RelationPart> rels = sheet.getRelationParts();
|
||||||
assertEquals(1, rels.size());
|
assertEquals(1, rels.size());
|
||||||
|
RelationPart rp = rels.get(0);
|
||||||
|
|
||||||
assertTrue(rels.get(0) instanceof XSSFDrawing);
|
assertTrue(rp.getDocumentPart() instanceof XSSFDrawing);
|
||||||
|
|
||||||
XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
|
XSSFDrawing drawing = rp.getDocumentPart();
|
||||||
|
|
||||||
//sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
|
//sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
|
||||||
assertSame(drawing, sheet.createDrawingPatriarch());
|
assertSame(drawing, sheet.createDrawingPatriarch());
|
||||||
String drawingId = drawing.getPackageRelationship().getId();
|
String drawingId = rp.getRelationship().getId();
|
||||||
|
|
||||||
//there should be a relation to this drawing in the worksheet
|
//there should be a relation to this drawing in the worksheet
|
||||||
assertTrue(sheet.getCTWorksheet().isSetDrawing());
|
assertTrue(sheet.getCTWorksheet().isSetDrawing());
|
||||||
|
Loading…
Reference in New Issue
Block a user