目的:通过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); } } } }
时间: 2024-10-13 11:41:41