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 }
/// <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()); } } }