Unable to set multiline while editing Word ContentControl using SDTElement

Home Forums WordprocessingML Unable to set multiline while editing Word ContentControl using SDTElement

This topic contains 1 reply, has 2 voices, and was last updated by  Eric White 4 months, 2 weeks ago.

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
  • #4141


    The following code sets the text inside the ContentControl from a Word Template. The ContentControls are iterated through WordProcessingDocument objects SDTElement’s SDTAlias value and if found set the appropriate desired text/date etc.

    	    byte[] byteArray = File.ReadAllBytes("Test.docx");
                using (MemoryStream mem = new MemoryStream())
                    mem.Write(byteArray, 0, (int)byteArray.Length);
                    using (WordprocessingDocument wordDoc =
                        WordprocessingDocument.Open(mem, true))
                        MainDocumentPart mainPart = wordDoc.MainDocumentPart;
                        foreach (SdtElement sdtEle in mainPart.Document.Descendants<SdtElement>())
                            string sdType = sdtEle.GetType().Name;
                            SdtAlias alias = sdtEle.Descendants<SdtAlias>().FirstOrDefault();
                            string sdtTitle = alias.Val.Value;
                            Run run = new Run();
                            if (alias != null)
                                // delete all paragraph of the sdt
                                sdtEle.Descendants<Paragraph>().ToList().ForEach(p => p.Remove());
                                switch (alias.Val.Value)
                                    case "TOPIC":
                                        var t = sdtEle.Descendants<Text>().FirstOrDefault();
                                        t.Text = "Text for Via Fedex1";
                                    case "DATE":
                                        var pd = sdtEle.Descendants<Text>().FirstOrDefault();
                                        pd.Text = "02/08/2017";
                                    case "ADDRESS":
                                        if(sdType.ToUpper() == "SDTRUN")
                                            var sca = sdtEle.Descendants<Text>().FirstOrDefault();
                                            //sca.Text = "ABC" + Environment.NewLine + "XYZ";
                                            run.AppendChild(new Text("ABC"));
                                            run.AppendChild(new Break());
                                            run.AppendChild(new Text("XYZ"));
                                        else if(sdType.ToUpper() == "SDTBLOCK")
                                            var t = sdtEle.Descendants<Text>().FirstOrDefault();
                                        	t.Text = "Another Address";
                    using (FileStream fileStream = new FileStream("Test1.docx",

    But in the above code, the multiline is NOT set to ContentControl (ADDRESS in above code) using the below lines
    //sca.Text = “ABC” + Environment.NewLine + “XYZ”;
    //run.AppendChild(new Text(“ABC”));
    //run.AppendChild(new Break());
    //run.AppendChild(new Text(“XYZ”));

    Please assist.


    Eric White


    Looking at your code, nothing looks incorrect to me, but I normally use LINQ to XML to access and manipulate content instead of the strongly-typed object model, so I may be missing something.

    In general, if you need to generate documents from data, I recommend using the DocumentAssembler module in Open-Xml-PowerTools.


    Watch those videos – you can do document assembly without writing code.

    If you go down that path, and if you continue to use the strongly-typed object model, I recommend closing and opening the document any time you switch between using LINQ to XML and the strongly-typed object model.

    Best, Eric

Viewing 2 posts - 1 through 2 (of 2 total)

You must be logged in to reply to this topic.