问题是,当我们用微软Word(我用的是2010年版)然后我们修改模板并保存。它改变了文档包含的内容。
下面是我们所拥有的,当我们使用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>
当我们使用Word编辑(添加一个分界线,或一些文本),我们救它,它改写fldSimple的东西像这样:
<w:p w: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>
我没有等待别人来解决这个问题,我只是试着做一个初稿的实施。我实际上修改了UpdateCustomPropertyValue(...)方法。我其实添加了第一个foreach的代码。第二个foreach已经存在,它适用于从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");
// Delete everything and insert updated text value
e.RemoveNodes();
XElement t = new XElement(w + "t", rPr, customPropertyValue);
Novacode.Text.PreserveSpace(t);
e.Add(new XElement(firstRun.Name, firstRun.Attributes(), firstRun.Element(XName.Get("rPr", w.NamespaceName)), t));
}
}
}