使用openxml sdk 操作word 无法刷新域信息
Posted 敢神
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用openxml sdk 操作word 无法刷新域信息相关的知识,希望对你有一定的参考价值。
目的:通过word制作模板,使用修改域的方法来更新替换数据模板数据。
工具:openxml sdk
难题1:openxml sdk没有用来刷新域信息的api,需要打开word按F9刷新
解决方法:
通过openxml sdk tool 可以观察到域的xml结构如下,每个域都是由标签<fldcar fldchartype=begin >开始 ,<instrText>记录域代码,
<fldcar fldchartype=separate > 后面的<text>展示域结果(此部分的作用是决定该域在word中展示的最终结果,可以修改这部分值,达到不需要在word中F9刷新更新域),
<fldcar fldchartype=end>结束当前域。
代码如下
/// <summary> /// 更新此节点下所有域 /// </summary> /// <param name="me">要更新的文档节点 如document、body等</param> /// <param name="values">关于域信息的键值对</param> public void UpdateFileds(OpenXmlElement me, Dictionary<string, string> values) { if (me.HasChildren) { IEnumerable<OpenXmlElement> childrens = me.ChildElements; int count = 0; bool hasFileds = false; string FieldCode=""; int mark = 0; foreach (OpenXmlElement itemOpenXmlElement in childrens) { count++; var itemChildElements=itemOpenXmlElement.ChildElements; if(itemChildElements.Count==0) continue; if (itemChildElements.OfType<FieldChar>().FirstOrDefault(p => p.FieldCharType == FieldCharValues.Begin) != null) { hasFileds = true; continue; } if (hasFileds) { if (itemChildElements.OfType<FieldChar>().FirstOrDefault(p => p.FieldCharType == FieldCharValues.End) != null) { hasFileds = false; FieldCode = ""; continue; } if (itemChildElements.OfType<FieldChar>().FirstOrDefault(p => p.FieldCharType == FieldCharValues.Separate) != null) { mark = count+1; continue; } if (mark == count && itemChildElements.OfType<Text>().FirstOrDefault()!=null) { string value = ""; values.TryGetValue(FieldCode, out value); Text text1 = new Text(); text1.Text = value; itemOpenXmlElement.RemoveAllChildren(); itemOpenXmlElement.Append(text1); continue; } var instrText = itemOpenXmlElement.ChildElements.OfType<FieldCode>().FirstOrDefault(); if (instrText != null) { foreach (string key in values.Keys) { if (instrText.Text.IndexOf(" " + key + " ") == -1) { FieldCode = ""; } else { FieldCode = key; } } } } else { UpdateFileds(itemOpenXmlElement, values); } } } }
以上是关于使用openxml sdk 操作word 无法刷新域信息的主要内容,如果未能解决你的问题,请参考以下文章
OpenXML - 将书签应用于 Word 文档中的段落