码迷,mamicode.com
首页 > 其他好文 > 详细

使用openxml sdk 操作word 无法刷新域信息

时间:2016-05-19 23:18:56      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

 

目的:通过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 无法刷新域信息

标签:

原文地址:http://www.cnblogs.com/brave-wang/p/5510508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!