使用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操作Office文档

在 OpenXml 复选框 word2013 中设置值

OpenXML - 将书签应​​用于 Word 文档中的段落

如何使用openxml C#在word文档中添加形状?

使用 OpenXML 和 Regex 在 Word Docx 中查找和替换撇号(')的问题

在使用openXML生成word文档时,试图合并表格单元格。