protected SdtElement CloneElementAndSetContentInPlaceholders(OpenXmlElementDataContext openXmlElementDataContext) { if (openXmlElementDataContext == null) { throw new ArgumentNullException("openXmlElementDataContext"); } if (openXmlElementDataContext.Element == null) { throw new ArgumentNullException("openXmlElementDataContext.element"); } SdtElement clonedSdtElement = null; if (openXmlElementDataContext.Element.Parent != null && openXmlElementDataContext.Element.Parent is Paragraph) { Paragraph clonedPara = openXmlElementDataContext.Element.Parent.InsertBeforeSelf(openXmlElementDataContext.Element.Parent.CloneNode(true) as Paragraph); clonedSdtElement = clonedPara.Descendants <SdtElement>().First(); } else { clonedSdtElement = openXmlElementDataContext.Element.InsertBeforeSelf(openXmlElementDataContext.Element.CloneNode(true) as SdtElement); } foreach (var v in clonedSdtElement.Elements()) { this.SetContentInPlaceholders(new OpenXmlElementDataContext() { Element = v, DataContext = openXmlElementDataContext.DataContext }); } return(clonedSdtElement); }
/// <summary> /// Container placeholder found. /// </summary> /// <param name="placeholderTag">The placeholder tag.</param> /// <param name="openXmlElementDataContext">The open XML element data context.</param> protected override void ContainerPlaceholderFound(string placeholderTag, OpenXmlElementDataContext openXmlElementDataContext) { if (openXmlElementDataContext == null || openXmlElementDataContext.Element == null || openXmlElementDataContext.DataContext == null) { return; } string tagPlaceHolderValue = string.Empty; string tagGuidPart = string.Empty; GetTagValue(openXmlElementDataContext.Element as SdtElement, out tagPlaceHolderValue, out tagGuidPart); string tagValue = string.Empty; string content = string.Empty; if (this.placeHolderNameToContentControlXmlMetadataCollection.ContainsKey(tagPlaceHolderValue)) { if (!this.isRefreshable) { tagValue = GetNodeText(openXmlElementDataContext.DataContext, this.placeHolderNameToContentControlXmlMetadataCollection[tagPlaceHolderValue].ControlTagXPath); if (!string.IsNullOrEmpty(tagValue)) { this.SetTagValue(openXmlElementDataContext.Element as SdtElement, GetFullTagValue(tagPlaceHolderValue, tagValue)); } foreach (var v in openXmlElementDataContext.Element.Elements()) { this.SetContentInPlaceholders(new OpenXmlElementDataContext() { Element = v, DataContext = openXmlElementDataContext.DataContext }); } } else { SdtElement parentContainer = openXmlElementDataContext.Element as SdtElement; // Sets the parentContainer from CustomXmlPart if refresh else saves the parentContainer markup to CustomXmlPart this.GetParentContainer(ref parentContainer, tagPlaceHolderValue); tagValue = GetNodeText(openXmlElementDataContext.DataContext, this.placeHolderNameToContentControlXmlMetadataCollection[tagPlaceHolderValue].ControlTagXPath); if (!string.IsNullOrEmpty(tagValue)) { this.SetTagValue(parentContainer, GetFullTagValue(tagPlaceHolderValue, tagValue)); } foreach (var v in parentContainer.Elements()) { this.SetContentInPlaceholders(new OpenXmlElementDataContext() { Element = v, DataContext = openXmlElementDataContext.DataContext }); } } } }
private static OpenXmlCompositeElement FindSdtContent(SdtElement sdt, string name) { OpenXmlCompositeElement sdtContent = sdt.Elements <SdtContentRun>().FirstOrDefault(); if (sdtContent == null) { sdtContent = sdt.Elements <SdtContentBlock>().FirstOrDefault(); } if (sdtContent == null) { sdtContent = sdt.Elements <SdtContentRow>().FirstOrDefault(); } if (sdtContent == null) { sdtContent = sdt.Elements <SdtContentCell>().FirstOrDefault(); } if (sdtContent == null) { throw new InvalidOperationException($"[{name}] Νο content element: {string.Join(", ", sdt.ChildElements.Select(o => o.GetType()))}"); } return(sdtContent); }
public static void SetContentOfContentControl(SdtElement contentControl, string content) { if (contentControl == null) { throw new ArgumentNullException("contentControl"); } content = string.IsNullOrEmpty(content) ? string.Empty : content; var isCombobox = contentControl.SdtProperties.Descendants <SdtContentDropDownList>().FirstOrDefault() != null; var isImage = contentControl.SdtProperties.Descendants <SdtContentPicture>().FirstOrDefault() != null; var prop = contentControl.Elements <SdtProperties>().FirstOrDefault(); if (isCombobox) { var openXmlCompositeElement = GetSdtContentOfContentControl(contentControl); var run = CreateRun(openXmlCompositeElement, content); SetSdtContentKeepingPermissionElements(openXmlCompositeElement, run); } if (isImage) { string embed = null; Drawing dr = contentControl.Descendants <Drawing>().FirstOrDefault(); if (dr != null) { DocumentFormat.OpenXml.Drawing.Blip blip = dr.Descendants <DocumentFormat.OpenXml.Drawing.Blip>().FirstOrDefault(); if (blip != null) { embed = blip.Embed; } } if (embed != null) { var document = (Document)prop.Ancestors <Body>().FirstOrDefault().Parent; IdPartPair idpp = document.MainDocumentPart.Parts.Where(pa => pa.RelationshipId == embed).FirstOrDefault(); if (idpp != null) { ImagePart ip = (ImagePart)idpp.OpenXmlPart; DirectoryInfo di = new DirectoryInfo(System.Reflection.Assembly.GetExecutingAssembly().Location); using (FileStream fileStream = File.Open(Path.Combine(di.Parent.FullName, content), FileMode.Open)) { ip.FeedData(fileStream); } } } } else { var openXmlCompositeElement = GetSdtContentOfContentControl(contentControl); contentControl.SdtProperties.RemoveAllChildren <ShowingPlaceholder>(); var runs = new List <Run>(); if (IsContentControlMultiline(contentControl)) { var textSplitted = content.Split(Environment.NewLine.ToCharArray()).ToList(); var addBreak = false; foreach (var textSplit in textSplitted) { var run = CreateRun(openXmlCompositeElement, textSplit); if (addBreak) { run.AppendChild(new Break()); } if (!addBreak) { addBreak = true; } runs.Add(run); } } else { runs.Add(CreateRun(openXmlCompositeElement, content)); } SdtContentCell aopenXmlCompositeElement = openXmlCompositeElement as SdtContentCell; if (aopenXmlCompositeElement != null) { AddRunsToSdtContentCell(aopenXmlCompositeElement, runs); } else if (openXmlCompositeElement is SdtContentBlock) { var para = CreateParagraph(openXmlCompositeElement, runs); SetSdtContentKeepingPermissionElements(openXmlCompositeElement, para); } else { SetSdtContentKeepingPermissionElements(openXmlCompositeElement, runs); } } }