Estoy tratando de copiar el contenido de los controles de contenido de texto enriquecido de un documento de Word a otro. Cada uno de los controles de contenido de texto enriquecido contiene un bloque de texto y algunos controles de contenido de texto sin formato. El siguiente código parece funcionar...
using (WordprocessingDocument doc = WordprocessingDocument.Open(destinationFile, true)) { MainDocumentPart mainPart = doc.MainDocumentPart; Dictionary<string, SdtBlock> sdtBlocks = getContentControlsFromDocument(sourceFile); foreach (KeyValuePair<string, SdtBlock> sdtBlock in sdtBlocks) { SdtElement control = mainPart.Document.Body.Descendants<SdtElement>().Where(r => { var tag = r.SdtProperties.GetFirstChild<Tag>(); return tag != null && tag.Val == sdtBlock.Key.ToLower(); }).FirstOrDefault(); SdtContentBlock cloneSdtContentBlock = (SdtContentBlock)sdtBlock.Value.Descendants<SdtContentBlock>().FirstOrDefault().Clone(); control.Parent.InsertAfter(cloneSdtContentBlock, control); control.Remove(); } mainPart.Document.Save(); } pero cuando trato de encontrar todos los controles de contenido dentro del archivo de destinationFile usando el código a continuación
string key = "tag_name"; List<SdtElement> controls = mainPart.Document.Body.Descendants<SdtElement>().Where(r => { var tag = r.SdtProperties.GetFirstChild<Tag>(); return tag != null && tag.Val == key.ToLower(); }).ToList(); No puedo encontrar los que estaban/están dentro del control de contenido de texto enriquecido copiado de sourceFile . En otras palabras, me gustaría copiar solo el contenido del Control de contenido de texto enriquecido sin el control en sí.
Actualizar:
Para simplificar la pregunta. Tengo un control de contenido de texto enriquecido que puede tener texto sin formato y un par de controles de contenido de texto sin formato. Todo lo que necesito es copiar (solo) el contenido dentro de este Control de contenido de texto enriquecido que envuelve todo en otro documento de Word.
Mientras tanto logré resolver el problema yo mismo. Aquí está la solución por lo que podría ser útil para alguien más.
using (WordprocessingDocument doc = WordprocessingDocument.Open(@"C:\tmp\test-1.docx", true)) { MainDocumentPart mainPart = doc.MainDocumentPart; foreach (var conditialTemplate in conditionalTemplates) { List<SdtElement> controls = mainPart.Document.Body.Descendants<SdtElement>().Where(r => { var tag = r.SdtProperties.GetFirstChild<Tag>(); return tag != null && tag.Val == conditialTemplate.ToLower(); }).ToList(); foreach (var control in controls) { if (control != null) { SdtProperties props = control.Elements<SdtProperties>().FirstOrDefault(); Tag tag = props.Elements<Tag>().FirstOrDefault(); Console.WriteLine("Tag: " + tag.Val); string theRightBlock = "A"; SdtBlock theRightSdtBlock = GetTheRightConditionalSdtBlock(theRightBlock, tag.Val); if (theRightSdtBlock != null) { OpenXmlElement parent = control.Parent; SdtBlock clone = new SdtBlock(); clone = (SdtBlock)theRightSdtBlock.Clone(); var elements = clone.GetFirstChild<SdtContentBlock>().ChildElements.ToList(); elements.Reverse(); elements.ForEach(child => { parent.InsertAfter(child.Clone() as OpenXmlElement, control); }); control.Remove(); } } } } mainPart.Document.Save(); }