internal OpenXmlCompositeElement Append(OpenXmlCompositeElement insertionPoint) { var elementsToMove = new List <OpenXmlElement>(); foreach (var element in _workingBody.ChildElements) { elementsToMove.Add(element); } foreach (var element in elementsToMove) { element.Remove(); if (element is OpenXmlCompositeElement ce && ce.HasText()) { // Ignore empty paragraphs. insertionPoint = insertionPoint.InsertAfterSelf(ce); } } CreateNewWorkingBody(); return(insertionPoint); }
internal void Append <T>() where T : OpenXmlCompositeElement { // Clone _newElement, because we're going to use the placeholders currently in it again. var clonedNewElement = _newElement.Clone() as T; if (_lastElement == null) { // First call to Append: _newElement points to the original template. _lastElement = _newElement.InsertAfterSelf(clonedNewElement); // Remove the original template from the document. _newElement.Remove(); } else { // Subsequent calls to Append. _lastElement = _lastElement.InsertAfterSelf(clonedNewElement); } // Create a pristine new element and initialize it with the placeholders. _newElement = _templateElement.Clone() as T; SetPlaceholders(_newElement); }
/// <summary> /// Allow to merge documents to insert it in a bookmark /// </summary> /// <param name="bookmark">Bookmark name</param> /// <param name="filesToInsert">Documents to insert</param> /// <param name="insertPageBreaks">Indicate if a page break must be added after each document</param> public void InsertDocsToBookmark(string bookmark, IList <MemoryStream> filesToInsert, bool insertPageBreaks) { if (string.IsNullOrWhiteSpace(bookmark)) { throw new Exception("Bookmark must not be null or white space"); } if (filesToInsert == null) { throw new Exception("FilesToInsert must not be null"); } var bookmarkElement = FindBookmark(bookmark); if (bookmarkElement != default(BookmarkEnd)) { OpenXmlCompositeElement openXmlCompositeElement = null; foreach (var file in filesToInsert) { using (WordprocessingDocument pkgSourceDoc = WordprocessingDocument.Open(file, true)) { var headers = pkgSourceDoc.MainDocumentPart.Document.Descendants <HeaderReference>().ToList(); foreach (var header in headers) { header.Remove(); } var footers = pkgSourceDoc.MainDocumentPart.Document.Descendants <FooterReference>().ToList(); foreach (var footer in footers) { footer.Remove(); } pkgSourceDoc.MainDocumentPart.Document.Save(); } string altChunkId = "AltChunkId-" + Guid.NewGuid(); AlternativeFormatImportPart chunk = wdMainDocumentPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML, altChunkId); file.Position = 0; chunk.FeedData(file); AltChunk altChunk = new AltChunk() { Id = altChunkId }; if (openXmlCompositeElement == null) { openXmlCompositeElement = wdDoc.MainDocumentPart.Document.Body.Descendants <BookmarkStart>().SingleOrDefault <BookmarkStart>((BookmarkStart b) => b.Name == bookmark) .Ancestors <Paragraph>().FirstOrDefault <Paragraph>(); } if (insertPageBreaks) { var lastRenderedPageBreak = new LastRenderedPageBreak(); var run = new Run(lastRenderedPageBreak); Paragraph paragraph = new Paragraph(run); openXmlCompositeElement.InsertAfterSelf <Paragraph>(paragraph); openXmlCompositeElement = paragraph; } openXmlCompositeElement.InsertAfterSelf <AltChunk>(altChunk); openXmlCompositeElement = altChunk; if (wdDoc == null) { throw new Exception("Document not loaded"); } } } }