The problem is that we use MS Word (I use the 2010 version), and then we modify the template and save it. It changes the contents of the document.
Here is what we have when we first create a template using DocX:
<w:fldSimple w:instr="DOCPROPERTY company_name \* MERGEFORMAT" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:r> <w:t> <w:rPr> <w:b /> <w:sz w:val="24" /> <w:szCs w:val="24" /> <w:color w:val="1F497D" /> </w:rPr>Company Name</w:t> </w:r> </w:fldSimple>
And when we edit Word (add an interrupt line or some text), and we save it, it rewrites fldSimple like this:
<w:pw:rsidR="006D64DE" w:rsidRDefault="006B25B1"> <w:r> <w:fldChar w:fldCharType="begin" /> </w:r> <w:r> <w:instrText>DOCPROPERTY company_name \* MERGEFORMAT</w:instrText> </w:r> <w:r> <w:fldChar w:fldCharType="separate" /> </w:r> <w:r> <w:rPr> <w:b /> <w:color w:val="1F497D" /> <w:sz w:val="24" /> <w:szCs w:val="24" /> </w:rPr> <w:t>Company Name</w:t> </w:r> ... <w:r> <w:rPr> <w:b /> <w:color w:val="1F497D" /> <w:sz w:val="24" /> <w:szCs w:val="24" /> </w:rPr> <w:fldChar w:fldCharType="end" /> </w:r> </w:p>
Instead of waiting for someone to fix this problem, I just tried to make the first implementation project. I actually modified the UpdateCustomPropertyValue (...) method. I really added the code of the first foreach . The second foreach already exists and applies to the document created from DocX .
internal static void UpdateCustomPropertyValue(DocX document, string customPropertyName, string customPropertyValue) { foreach (XElement e in document.mainDoc.Descendants(XName.Get("instrText", w.NamespaceName))) { string attr_value = e.Value.Replace(" ", string.Empty).Trim(); string match_value = string.Format(@"DOCPROPERTY {0} \* MERGEFORMAT", customPropertyName).Replace(" ", string.Empty); if (attr_value.Equals(match_value, StringComparison.CurrentCultureIgnoreCase)) { XNode node = e.Parent.NextNode; bool found = false; while (true) { if (node.NodeType == XmlNodeType.Element) { var ele = node as XElement; var match = ele.Descendants(XName.Get("t", w.NamespaceName)); if (match.Count() > 0) { if (!found) { match.First().Value = customPropertyValue; found = true; } else { ele.RemoveNodes(); } } else { match = ele.Descendants(XName.Get("fldChar", w.NamespaceName)); if (match.Count() > 0) { var endMatch = match.First().Attribute(XName.Get("fldCharType", w.NamespaceName)); if (endMatch != null && endMatch.Value == "end") { break; } } } } node = node.NextNode; } } } foreach (XElement e in document.mainDoc.Descendants(XName.Get("fldSimple", w.NamespaceName))) { string attr_value = e.Attribute(XName.Get("instr", w.NamespaceName)).Value.Replace(" ", string.Empty).Trim(); string match_value = string.Format(@"DOCPROPERTY {0} \* MERGEFORMAT", customPropertyName).Replace(" ", string.Empty); if (attr_value.Equals(match_value, StringComparison.CurrentCultureIgnoreCase)) { XElement firstRun = e.Element(w + "r"); XElement firstText = firstRun.Element(w + "t"); XElement rPr = firstText.Element(w + "rPr");
source share