使用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);
                    }

                }

            }
        }

  

时间: 2024-10-13 11:41:41

使用openxml sdk 操作word 无法刷新域信息的相关文章

OpenXml操作Word的一些操作总结.无word组件生成word.

OpenXml相对于用MS提供的COM组件来生成WORD,有如下优势: 1.相对于MS 的COM组件,因为版本带来的不兼容问题,及各种会生成WORD半途会崩溃的问题. 2.对比填满一张30多页的WORD来说(包含图,表等),用COM组件来生成会占用20秒,Openxml1秒. 3.MS Word软件太贵了,你的客户装的是开源WORD,如LibreOffice,OpenOffice.这样你就只能用Openxml生成的WORD文档,各种支持MS Word都能打开,避免客户机器上安装MS Word.

OpenXml操作Word的一些操作总结. - 天天不在

OpenXml相对于用MS提供的COM组件来生成WORD,有如下优势: 1.相对于MS 的COM组件,因为版本带来的不兼容问题,及各种会生成WORD半途会崩溃的问题. 2.对比填满一张30多页的WORD来说(包含图,表等),用COM组件来生成会占用20秒,Openxml1秒. 3.MS Word软件太贵了,你的客户装的是开源WORD,如LibreOffice,OpenOffice.这样你就只能用Openxml生成的WORD文档,各种支持MS Word都能打开,避免客户机器上安装MS Word.

XDocReport 的简单使用 操作word 替换变量

XDocReport 主要是操作word,在word模版中定义变量并替换变量.(在word中还可替换动态图片,可进行循环.判断操作,可定义指令扩展程序,可转成pdf文件 等) 1,模版变量定义. 新建word,Ctrl + F9   编辑域   选择MergeField  编辑域代码 如图: 2,代码 /** * 根据模板导出word文件 * * @param reportData ReportData对象为数据对象,里面存储Map 数据 * @param templateName 模板文件路径

java调用com组件操作word使用总结(jacob)

ava调用com组件操作word使用总结(jacob) 简单描述 在此处输入简单摘要 特别声明:使用java-com技术可以完成任何VBA可以完成的office文档操作; 一.准备工作 先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的.这是一个开始于 1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献. Jacob下载地址: http://s

VC操作WORD文档总结

一.写在开头 最近研究word文档的解析技术,我本身是VC的忠实用户,看到C#里面操作WORD这么舒服,同时也看到单位有一些需求,就想尝试一下,结果没想到里面的技术点真不少,同时网络上的共享资料很多,但是很多就是起了一个头没有完整的资料,因此在此记录一下,首先感谢怪兽哥哥(开源了了IOCP一整套开源库的家伙还有很多隐藏技能大家可以关注他).骨头哥(不少好资料).savageII哥(大牛)这些网友他们很有共享精神.废话不说了开始正题. 二.环境搭建 我用的VC2010,其实在VC6.0以上的版本设

[转]C#操作word模板插入文字、图片及表格详细步骤

c#操作word模板插入文字.图片及表格 1.建立word模板文件 person.dot用书签 标示相关字段的填充位置 2.建立web应用程序 加入Microsoft.Office.Interop.Word引用具体添加引用请参看http://www.microsoft.com/china/msdn/library/office/office/OfficePrIntopAssFAQ.mspx?mfr=true 3.相关示例代码 protected void CreateReport_Click(o

C#操作Word的超详细总结

本文中用C#来操作Word,包括: 创建Word: 插入文字,选择文字,编辑文字的字号.粗细.颜色.下划线等: 设置段落的首行缩进.行距: 设置页面页边距和纸张大小: 设置页眉.页码: 插入图片,设置图片宽高以及给图片添加标题: 插入表格,格式化表格,往表格中插入数据: 保存Word,打印Word: 重新打开Word等. Visual studio版本:Visual Studio 2012(2010应该也可以) 准备工作: /* 1. 添加引用COM里面的 Microsoft Word 12.0

ASP.NET 操作WORD 遇到的两个问题之后的解决办法

因为用到ASP.NET操作word,根据网页内容在服务端生成word之后,供用户下载. 在本机测试时,一切正常,当我发布到服务器之后,问题来了 1,提示:未将对象引用设置到对象的实例. 搜素之后,按照网上的内容开始折腾,才发现这个问题真烦人. 根据网友的帖子,cmd 输入"dcomcnfg.exe", 如图所示,并没有出现帖子所描述的word之类的,唯一沾边的也就这个了,经过各种权限设置之后,还是不行(也可能时我设置的不对). 突然想起来服务器环境时64位,而开发环境时32位,搜索之后

csharp:OpenXml SDK 2.0 and ClosedXML read excel file

https://openxmlexporttoexcel.codeplex.com/ 引用: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using DocumentForma