/** * Returns the {@link PackageRelationship#GetId()} of the * {@link PackageRelationship}, that sources from the {@link PackagePart} of * this {@link POIXMLDocumentPart} to the {@link PackagePart} of the given * parameter value. * * @param part * The {@link POIXMLDocumentPart} for which the according * relation-id shall be found. * @return The value of the {@link PackageRelationship#GetId()} or null, if * parts are not related. */ public String GetRelationId(POIXMLDocumentPart part) { foreach (KeyValuePair <String, POIXMLDocumentPart> entry in relations) { if (entry.Value == part) { return(entry.Key); } } return(null); }
/** * Iterate through the underlying PackagePart and create child POIXMLFactory instances * using the specified factory * * @param factory the factory object that Creates POIXMLFactory instances * @param context context map Containing already visited noted keyed by tarGetURI */ protected void Read(POIXMLFactory factory, Dictionary <PackagePart, POIXMLDocumentPart> context) { try { PackageRelationshipCollection rels = packagePart.Relationships; foreach (PackageRelationship rel in rels) { if (rel.TargetMode == TargetMode.Internal) { Uri uri = rel.TargetUri; PackagePart p; if (uri.OriginalString.IndexOf('#') >= 0) { /* * For internal references (e.g. '#Sheet1!A1') the namespace part is null */ p = null; } else { PackagePartName relName = PackagingUriHelper.CreatePartName(uri); p = packagePart.Package.GetPart(relName); if (p == null) { logger.Log(POILogger.ERROR, "Skipped invalid entry " + rel.TargetUri); continue; } } if (p == null || !context.ContainsKey(p)) { POIXMLDocumentPart childPart = factory.CreateDocumentPart(this, rel, p); childPart.parent = this; AddRelation(rel.Id, childPart); if (p != null) { context[p] = childPart; if (p.HasRelationships) { childPart.Read(factory, context); } } } else { AddRelation(rel.Id, context[p]); } } } } catch (Exception ex) { if ((null != ex.InnerException) && (null != ex.InnerException.InnerException)) { // this type of exception is thrown when the XML Serialization does not match the input. logger.Log(1, ex.InnerException.InnerException); } throw; } }
/** * Remove the relation to the specified part in this namespace and remove the * part, if it is no longer needed. */ protected internal void RemoveRelation(POIXMLDocumentPart part) { RemoveRelation(part, true); }
/** * Add a new child POIXMLDocumentPart * * @param part the child to add */ public void AddRelation(string id, POIXMLDocumentPart part) { relations[id] = part; part.IncrementRelationCounter(); }
/** * Creates an POIXMLDocumentPart representing the given namespace part, relationship and parent * Called by {@link #read(POIXMLFactory, java.util.Map)} when Reading in an exisiting file. * * @param parent - Parent part * @param part - The namespace part that holds xml data represenring this sheet. * @param rel - the relationship of the given namespace part * @see #read(POIXMLFactory, java.util.Map) */ public POIXMLDocumentPart(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) { this.packagePart = part; this.packageRel = rel; this.parent = parent; }
/** * Create a POIXMLDocumentPart from existing namespace part and relation. This method is called * from {@link POIXMLDocument#load(POIXMLFactory)} when parsing a document * * @param parent parent part * @param rel the namespace part relationship * @param part the PackagePart representing the Created instance * @return A new instance of a POIXMLDocumentPart. */ public abstract POIXMLDocumentPart CreateDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part);