protected static OpenXmlPart GetReferencedPart(ValidationContext context, string path)
        {
            if (path == ".")
            {
                return(context.Part);
            }

            string[] parts = path.Split('/');

            if (string.IsNullOrEmpty(parts[0]))
            {
                return(GetPartThroughPartPath(context.Package.Parts, parts.Skip(1).ToArray())); //absolute path
            }
            else if (parts[0] == "..")
            {
                IEnumerable <OpenXmlPart> iterator = new OpenXmlPackagePartIterator(context.Package);

                IEnumerable <OpenXmlPart> refParts = iterator.Where(p => p.Parts.Select(r => r.OpenXmlPart.PackagePart.Uri)
                                                                    .Contains(context.Part.PackagePart.Uri));

                Debug.Assert(refParts.Count() == 1);

                return(refParts.First());
            }
            else
            {
                return(GetPartThroughPartPath(context.Part.Parts, parts)); //relative path
            }
        }
        protected static OpenXmlPart GetReferencedPart(ValidationContext context, string path)
        {
            if (path == ".")
            {
                return context.Part;
            }

            string[] parts = path.Split('/');

            if (string.IsNullOrEmpty(parts[0]))
            {
                return GetPartThroughPartPath(context.Package.Parts, parts.Skip(1).ToArray()); //absolute path
            }
            else if (parts[0] == "..")
            {
                IEnumerable<OpenXmlPart> iterator = new OpenXmlPackagePartIterator(context.Package);

                IEnumerable<OpenXmlPart> refParts = iterator.Where(p => p.Parts.Select(r => r.OpenXmlPart.PackagePart.Uri)
                                                            .Contains(context.Part.PackagePart.Uri));

                Debug.Assert(refParts.Count() == 1);

                return refParts.First();
            }
            else
            {
                return GetPartThroughPartPath(context.Part.Parts, parts); //relative path
            }
        }
        public void AutoSaveTestDocx()
        {
            #region Prepare
            // The content of parts changes should be saved when the package is disposed
            string testFile = "autosavetest.docx";
            // copy test file
            PrepareTestFile(testFile, TestFileStreams.complex0docx);
            #endregion

            #region No change
            // open the file in readonly mode, nothing should be saved on disposing
            FileInfo fileInfo0 = new FileInfo(testFile);
            using (var document = WordprocessingDocument.Open(testFile, false))
            {
                document.MainDocumentPart.Document.Body.Append(new Paragraph());
            }

            FileInfo fileInfo1 = new FileInfo(testFile);
            Assert.Equal(fileInfo0.Length, fileInfo1.Length);
            #endregion

            #region Change main doucment & style parts
            string originalFile = "autosavetest0.docx";
            File.Copy(testFile, originalFile); // backup file
            // HACK : Open and close the file with SDK to normalize the file
            // since the SDK will change contents when closing the package.
            using (var doc = WordprocessingDocument.Open(originalFile, true))
            {
                // do nothing here
            }

            // open the file in readWrite mode, and then changes should be saved
            using (var document = WordprocessingDocument.Open(testFile, true))
            {
                var firstText = document.MainDocumentPart.Document.Descendants<Text>().First();
                // change text of the first run
                firstText.Text = "Changed";

                var stylePart = document.MainDocumentPart.GetPartsOfType<StyleDefinitionsPart>().First();
                var heading1Style = stylePart.Styles.Descendants<Style>().Where(style => style.StyleId == "Heading1").Single();
                // change color to be black
                heading1Style.Descendants<Color>().First().Val = "000000";
            }

            // check the changes. other parts should be the same
            using (var document = WordprocessingDocument.Open(testFile, false))
            {
                var firstText = document.MainDocumentPart.Document.Descendants<Text>().First();
                Assert.Equal("Changed", firstText.Text);
                var stylePart = document.MainDocumentPart.GetPartsOfType<StyleDefinitionsPart>().First();
                var heading1Style = stylePart.Styles.Descendants<Style>().Where(s => s.StyleId == "Heading1").Single();
                Assert.Equal("000000", heading1Style.Descendants<Color>().First().Val.Value);
            }

            using (var orginalDoc = WordprocessingDocument.Open(originalFile, false))
            using (var changedDoc = WordprocessingDocument.Open(testFile, false))
            {
                OpenXmlPackagePartIterator origianalDocIterator = new OpenXmlPackagePartIterator(orginalDoc);
                OpenXmlPackagePartIterator changedDocIterator = new OpenXmlPackagePartIterator(changedDoc);
                var changedDocEnumerator = changedDocIterator.GetEnumerator();
                foreach (var originalPart in origianalDocIterator)
                {
                    Assert.True(changedDocEnumerator.MoveNext());
                    if (!(originalPart is MainDocumentPart)
                        && !(originalPart is StyleDefinitionsPart))
                    {
                        Assert.Equal(originalPart.GetType(), changedDocEnumerator.Current.GetType());
                        //Assert.Equal(originalPart.GetStream().Length,
                        //    changedDocEnumerator.Current.GetStream().Length,
                        //    changedDocEnumerator.Current.Uri + "||" + changedDocEnumerator.Current.Uri);
                        Assert.Equal(originalPart.GetStream().Length,
                            changedDocEnumerator.Current.GetStream().Length);
                    }
                }
            }

            #endregion

            #region Exit
            // clean temp files
            File.Delete(testFile);
            File.Delete(originalFile);
            #endregion
        }
示例#4
0
        /// <summary>
        /// Enumerates all <see cref="DataPartReferenceRelationship" />s that reference the current data part.
        /// </summary>
        public IEnumerable<DataPartReferenceRelationship> GetDataPartReferenceRelationships()
        {
            ThrowIfObjectDisposed();

            // first, see if there are any reference in package leve.
            foreach (var dataPartReferenceRelationship in this.OpenXmlPackage.DataPartReferenceRelationships)
            {
                if (dataPartReferenceRelationship.DataPart == this)
                {
                    yield return dataPartReferenceRelationship;
                }
            }

            // for each part in the package, check the DataPartReferenceRelationships.
            OpenXmlPackagePartIterator partIterator = new OpenXmlPackagePartIterator(this.OpenXmlPackage);
            foreach (var openXmlPart in partIterator)
            {
                foreach (var dataPartReferenceRelationship in openXmlPart.DataPartReferenceRelationships)
                {
                    if (dataPartReferenceRelationship.DataPart == this)
                    {
                        yield return dataPartReferenceRelationship;
                    }
                }
            }

            yield break;
        }
        public void OpenXmlPackagePartIteraterTest()
        {
            // Test with WordprocessingDocument
            using (var stream = new MemoryStream(TestFileStreams.complex0docx))
            {
                using (var document = WordprocessingDocument.Open(stream, false))
                {
                    OpenXmlPackagePartIterator iterator = new OpenXmlPackagePartIterator(document);
                    Assert.Equal(31, iterator.Count());
                    // Make sure it works well for multi calls
                    Assert.Equal(31, iterator.Count());
                }
            }
        

            // Test with PresentationDocument
            using (var stream = new MemoryStream(TestFileStreams.o09_Performance_typical_pptx))
            {
                using (var document = PresentationDocument.Open(stream, false))
                {
                    OpenXmlPackagePartIterator iterator = new OpenXmlPackagePartIterator(document);
                    Assert.Equal(65, iterator.Count());
                    // There is one audio part.
                    Assert.Equal(1, document.DataParts.Count());
                }
            }
        }