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 7 years, 9 months ago.
-
AuthorPosts
-
February 8, 2017 at 6:02 am #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"; break; case "DATE": var pd = sdtEle.Descendants<Text>().FirstOrDefault(); pd.Text = "02/08/2017"; break; 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"; break; } break; } } } } using (FileStream fileStream = new FileStream("Test1.docx", System.IO.FileMode.CreateNew)) { mem.WriteTo(fileStream); }
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”;
OR
//run.AppendChild(new Text(“ABC”));
//run.AppendChild(new Break());
//run.AppendChild(new Text(“XYZ”));Please assist.
February 8, 2017 at 11:59 am #4142Hi,
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.
http://www.ericwhite.com/blog/blog/documentassembler-developer-center/
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
-
AuthorPosts
You must be logged in to reply to this topic.