Ejemplo n.º 1
0
        /**
         * Recursively copy namespace parts to the destination namespace
         */
        private static void Copy(OPCPackage pkg, PackagePart part, OPCPackage tgt, PackagePart part_tgt) {
        PackageRelationshipCollection rels = part.Relationships;
        if(rels != null) 
            foreach (PackageRelationship rel in rels) {
            PackagePart p;
            if(rel.TargetMode == TargetMode.External){
                part_tgt.AddExternalRelationship(rel.TargetUri.ToString(), rel.RelationshipType, rel.Id);
                //external relations don't have associated namespace parts
                continue;
            }
            Uri uri = rel.TargetUri;

            if(uri.Fragment != null) {
                part_tgt.AddRelationship(uri, (TargetMode)rel.TargetMode, rel.RelationshipType, rel.Id);
                continue;
            }
            PackagePartName relName = PackagingUriHelper.CreatePartName(rel.TargetUri);
            p = pkg.GetPart(relName);
            part_tgt.AddRelationship(p.PartName, (TargetMode)rel.TargetMode, rel.RelationshipType, rel.Id);




            PackagePart dest;
            if(!tgt.ContainPart(p.PartName)){
                dest = tgt.CreatePart(p.PartName, p.ContentType);
                Stream out1 = dest.GetOutputStream();
                IOUtils.Copy(p.GetInputStream(), out1);
                out1.Close();
                Copy(pkg, p, tgt, dest);
            }
        }
    }
Ejemplo n.º 2
0
 internal void GenerateRelationIfNeeded(PackagePart sheetPart)
 {
     if (this._externalRel != null || !this.NeedsRelationToo())
     {
         return;
     }
     this._ctHyperlink.id = sheetPart.AddExternalRelationship(this._location, XSSFRelation.SHEET_HYPERLINKS.Relation).Id;
 }
Ejemplo n.º 3
0
        /**
         * Generates the relation if required
         */
        internal void GenerateRelationIfNeeded(PackagePart sheetPart)
        {
            if (_externalRel == null && NeedsRelationToo())
            {
                // Generate the relation
                PackageRelationship rel =
                    sheetPart.AddExternalRelationship(_location, XSSFRelation.SHEET_HYPERLINKS.Relation);

                // Update the r:id
                _ctHyperlink.id = rel.Id;
            }
        }
Ejemplo n.º 4
0
        public void TestCreateRelationsFromScratch()
        {
            MemoryStream baos = new MemoryStream();
            OPCPackage   pkg  = OPCPackage.Create(baos);

            PackagePart partA =
                pkg.CreatePart(PackagingUriHelper.CreatePartName("/partA"), "text/plain");
            PackagePart partB =
                pkg.CreatePart(PackagingUriHelper.CreatePartName("/partB"), "image/png");

            Assert.IsNotNull(partA);
            Assert.IsNotNull(partB);

            // Internal
            partA.AddRelationship(partB.PartName, TargetMode.Internal, "http://example/Rel");

            // External
            partA.AddExternalRelationship("http://poi.apache.org/", "http://example/poi");
            partB.AddExternalRelationship("http://poi.apache.org/ss/", "http://example/poi/ss");

            // Check as expected currently
            Assert.AreEqual("/partB", partA.GetRelationship("rId1").TargetUri.ToString());
            Assert.AreEqual("http://poi.apache.org/",
                            partA.GetRelationship("rId2").TargetUri.ToString());
            Assert.AreEqual("http://poi.apache.org/ss/",
                            partB.GetRelationship("rId1").TargetUri.ToString());


            // Save, and re-load
            pkg.Close();
            MemoryStream bais = new MemoryStream(baos.ToArray());

            pkg = OPCPackage.Open(bais);

            partA = pkg.GetPart(PackagingUriHelper.CreatePartName("/partA"));
            partB = pkg.GetPart(PackagingUriHelper.CreatePartName("/partB"));


            // Check the relations
            Assert.AreEqual(2, partA.Relationships.Size);
            Assert.AreEqual(1, partB.Relationships.Size);

            Assert.AreEqual("/partB", partA.GetRelationship("rId1").TargetUri.OriginalString);
            Assert.AreEqual("http://poi.apache.org/",
                            partA.GetRelationship("rId2").TargetUri.ToString());
            Assert.AreEqual("http://poi.apache.org/ss/",
                            partB.GetRelationship("rId1").TargetUri.ToString());
            // Check core too
            Assert.AreEqual("/docProps/core.xml",
                            pkg.GetRelationshipsByType(
                                "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties").GetRelationship(0).TargetUri.ToString());
        }
Ejemplo n.º 5
0
        private static void Copy(OPCPackage pkg, PackagePart part, OPCPackage tgt, PackagePart part_tgt)
        {
            PackageRelationshipCollection relationships = part.Relationships;

            if (relationships == null)
            {
                return;
            }
            foreach (PackageRelationship packageRelationship in relationships)
            {
                TargetMode?targetMode = packageRelationship.TargetMode;
                if ((targetMode.GetValueOrDefault() != TargetMode.External ? 0 : (targetMode.HasValue ? 1 : 0)) != 0)
                {
                    part_tgt.AddExternalRelationship(packageRelationship.TargetUri.ToString(), packageRelationship.RelationshipType, packageRelationship.Id);
                }
                else
                {
                    Uri targetUri = packageRelationship.TargetUri;
                    if (targetUri.Fragment != null)
                    {
                        part_tgt.AddRelationship(targetUri, packageRelationship.TargetMode.Value, packageRelationship.RelationshipType, packageRelationship.Id);
                    }
                    else
                    {
                        PackagePartName partName = PackagingUriHelper.CreatePartName(packageRelationship.TargetUri);
                        PackagePart     part1    = pkg.GetPart(partName);
                        part_tgt.AddRelationship(part1.PartName, packageRelationship.TargetMode.Value, packageRelationship.RelationshipType, packageRelationship.Id);
                        if (!tgt.ContainPart(part1.PartName))
                        {
                            PackagePart part2        = tgt.CreatePart(part1.PartName, part1.ContentType);
                            Stream      outputStream = part2.GetOutputStream();
                            IOUtils.Copy(part1.GetInputStream(), outputStream);
                            outputStream.Close();
                            PackageHelper.Copy(pkg, part1, tgt, part2);
                        }
                    }
                }
            }
        }
Ejemplo n.º 6
0
        public void TestCreateExcelHyperlinkRelations()
        {
            String      filepath = OpenXml4NetTestDataSamples.GetSampleFileName("ExcelWithHyperlinks.xlsx");
            OPCPackage  pkg      = OPCPackage.Open(filepath, PackageAccess.READ_WRITE);
            PackagePart sheet    = pkg.GetPart(
                PackagingUriHelper.CreatePartName(SHEET_WITH_COMMENTS));

            Assert.IsNotNull(sheet);

            Assert.AreEqual(3, sheet.GetRelationshipsByType(HYPERLINK_REL_TYPE).Size);

            // Add three new ones
            PackageRelationship openxml4j =
                sheet.AddExternalRelationship("http://www.Openxml4j.org/", HYPERLINK_REL_TYPE);
            PackageRelationship sf =
                sheet.AddExternalRelationship("http://openxml4j.sf.net/", HYPERLINK_REL_TYPE);
            PackageRelationship file =
                sheet.AddExternalRelationship("MyDocument.docx", HYPERLINK_REL_TYPE);

            // Check they were Added properly
            Assert.IsNotNull(openxml4j);
            Assert.IsNotNull(sf);
            Assert.IsNotNull(file);

            Assert.AreEqual(6, sheet.GetRelationshipsByType(HYPERLINK_REL_TYPE).Size);

            Assert.AreEqual("http://www.openxml4j.org/", openxml4j.TargetUri.ToString());
            Assert.AreEqual("/xl/worksheets/sheet1.xml", openxml4j.SourceUri.ToString());
            Assert.AreEqual(HYPERLINK_REL_TYPE, openxml4j.RelationshipType);

            Assert.AreEqual("http://openxml4j.sf.net/", sf.TargetUri.ToString());
            Assert.AreEqual("/xl/worksheets/sheet1.xml", sf.SourceUri.ToString());
            Assert.AreEqual(HYPERLINK_REL_TYPE, sf.RelationshipType);

            Assert.AreEqual("MyDocument.docx", file.TargetUri.ToString());
            Assert.AreEqual("/xl/worksheets/sheet1.xml", file.SourceUri.ToString());
            Assert.AreEqual(HYPERLINK_REL_TYPE, file.RelationshipType);

            // Will Get ids 7, 8 and 9, as we already have 1-6
            Assert.AreEqual("rId7", openxml4j.Id);
            Assert.AreEqual("rId8", sf.Id);
            Assert.AreEqual("rId9", file.Id);


            // Write out and re-load
            MemoryStream baos = new MemoryStream();

            pkg.Save(baos);
            MemoryStream bais = new MemoryStream(baos.ToArray());

            pkg = OPCPackage.Open(bais);
            // use revert to not re-write the input file
            pkg.Revert();
            // Check again
            sheet = pkg.GetPart(
                PackagingUriHelper.CreatePartName(SHEET_WITH_COMMENTS));

            Assert.AreEqual(6, sheet.GetRelationshipsByType(HYPERLINK_REL_TYPE).Size);

            Assert.AreEqual("http://poi.apache.org/",
                            sheet.GetRelationship("rId1").TargetUri.ToString());
            Assert.AreEqual("mailto:[email protected]?subject=XSSF Hyperlinks",
                            sheet.GetRelationship("rId3").TargetUri.ToString());

            Assert.AreEqual("http://www.openxml4j.org/",
                            sheet.GetRelationship("rId7").TargetUri.ToString());
            Assert.AreEqual("http://openxml4j.sf.net/",
                            sheet.GetRelationship("rId8").TargetUri.ToString());
            Assert.AreEqual("MyDocument.docx",
                            sheet.GetRelationship("rId9").TargetUri.ToString());
        }