在Web项目中处理Word文档,经常会用到Word模板,只不过这里的“模板”概念,都是指在Web项目中预先放置的doc、docx等扩展名的、真正的Word文档,对于Excel和PPT就是指xls、xlsx、ppt、pptx等扩展名的文件,而不是指微软Office的dot、dotx、xlt、xltx等扩展名的文件。对于模板的使用,有两种方式:

  • 从模板起草文件。首先用户选择Word文件模板,通过程序代码从模板复制出新的文件,然后通过程序动态填充或用户手动填写新文件中各个模板项的内容,接下来用户编辑正文后,再进入领导审阅、核稿等环节,最后确认正式文件。详细请参考从模板起草文件

  • 编辑文件正文后,使用模板对文件套红。文件经过起草编辑正文、领导审阅、核稿等环节后,确认了正式的文件正文内容(此时文件中还没有红头),将文件正文内容套入到红头模板中,生成正式的文件。

    本文重点介绍第二种方式,即编辑文件正文后,使用模板对文件套红。

Word模板文档的来源可以分为两种:

  • 项目开发完成后模板固定不变的情况。一般由开发人员在项目开发过程中一边开发一边制作,也就是开发人员直接手动新建模板Word文件,编辑模板文件内容、样式、排版等,并在需要动态填充数据的位置插入数据区域或数据标签即可。
  • 项目正式发布后,需要根据实际需求的变动,由用户自己重新编辑制作模板。此时就需要给用户开发一个模板管理模块,让用户自己新建、编辑模板Word文件内容、样式、排版等,并在需要动态填充数据的位置插入数据区域或数据标签。使用此方案的优点:实际需求变动后,项目无需修改代码再经过重新编译、重新发布等环节,这样就实现了项目的灵活性,显著降低了开发者的维护成本和工作量。详细请参考用户自定义模板中数据区域和用户自定义模板中数据标签

如果用户套红使用的红头模板中包含了动态数据项,比如一个通知模板,里面包含了发文号、发文单位、发文日期等很多需要用程序或手动修改的数据项,那么就可以通过调用PageOffice的动态填充数据功能来完成,这样做不但减少了用户手动再次录入的工作量,提供了很好的用户体验,而且避免了用户手动编辑动态数据项的误操作,造成与数据库中相关值的不一致,还有就是编写代码调用PageOffice动态填充数据的工作量也是很少的;如果用户给文件套红时,使用的红头模板里面只是简单的红头,没有动态数据项,那就连动态填充数据的代码都无需编写了。接下来我们模拟一下编辑文件正文后,使用“通知模板”对文件套红的实现过程:

  1. 一般情况下,一个Web项目的文件起草模块都会给用户提供一个起草文件的表单让用户填写,用户提交保存后,创建新文件的同时,还会把这些数据保存到数据库中作为文件的关联属性数据。比如开发人员在Web系统中开发的起草通知功能是这样的:给用户提供了一个起草文件的页面(以下图为例),让用户填写各项表单数据,并点击“提交”按钮后,就会在项目的数据库中添加新的文件记录,同时创建一个空白的通知文件(比如文件名为“ZhenWen.docx”),并让用户在线打开此文件,编辑通知的正文内容。

  2. 用户编辑通知文件(ZhengWen.docx)的正文内容,并经过了领导的审阅、核稿保存后,文件内容如下图所示:

  3. 用户选择通知模板,对文件进行套红。假如通知模板文件为:template_tongzhi.docx,模板内容和样式如下图所示。

模板里面包含的数据区域有:

  • 发文单位 PO_FaWenDanWei
  • 年份 PO_NianFen
  • 发文号 PO_FaWenHao
  • 标题 PO_BiaoTi
  • 主题词 PO_ZhuTiCi
  • 打印份数 PO_DaYinFenShu
  • 正文内容 PO_Content

模板中包含的数据标签有:

○ 发文日期 {#发文日期#}

注意

在使用PageOffice开发的过程中,为了避免出现与用户自己定义的书签出现冲突,要求插入的书签名称必须以“PO_”开头。注意是字母o,不是数字0。在PageOffice的概念里提到的数据区域,本质上就是书签,但是只有“PO_”开头的书签才叫数据区域。

注意

数据标签本质上只是普通的文本,但是用一些特殊格式的文本做标记,比如“{日期}”、“{##日期##}”、“[日期]”、“【@日期】”等等,只要这些文本内容足够特殊,有别于文件中的正式内容,就可以当做数据标签。

  1. 用户选择模板开始套红时,通过执行程序代码复制通知模板为正式文件,比如:TongZhi008.docx,调用PageOffice在线打开TongZhi008.docx,并调用PageOffice的WordDocument对象动态填充各项数据,比如:发文单位、发文日期、标题、打印份数等到TongZhi008.docx中,同时调用WordDocument对象动态插入用户编辑的通知正文文件到TongZhi008.docx中“正文内容”所在位置,套红生成正式文件。如下图所示:

后端代码

复制通知模板(template_tongzhi.docx)为正式文件:TongZhi008.docx

File templateFile = new File("D:\\template_tongzhi.docx");
File newFile = new File("D:\\TongZhi008.docx");
Files.copy(templateFile.toPath(), newFile.toPath());

PageOffice在线打开TongZhi008.docx,并调用PageOffice的WordDocument对象进行套红操作

 PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);

 WordDocument worddoc = new WordDocument();
// 为了代码简单,以下给数据区域赋值常量,正式开发时,可以从数据库中读取数据。
// ------ 给动态数据项赋值开始,如果红头模板中没有动态数据项,请忽略此段代码------
worddoc.openDataRegion("PO_FaWenDanWei").setValue("某某科技行政办公室");
worddoc.openDataRegion("PO_NianFen").setValue("2023");
worddoc.openDataRegion("PO_FaWenHao").setValue("008");
worddoc.openDataRegion("PO_BiaoTi").setValue("印发XX管理制度");
worddoc.openDataRegion("PO_ZhuTiCi").setValue("管理 制度 通知");
worddoc.openDataRegion("PO_DaYinFenShu").setValue("10");
// 发文日期为数据标签
worddoc.openDataTag("{#发文日期#}").setValue("2023年5月10日");
// ------ 给动态数据项数据赋值结束 ------ // 正文内容为用户编辑的通知正文文件ZhengWen.docx。以下代码为套红必须代码。
DataRegion drContent = worddoc.openDataRegion("PO_Content");
//“[word][/word]”标签的参数地址可以是“磁盘路径”,也可以是“文档url下载地址(不支持跨域)”
drContent.setValue("[word]D:\\ZhengWen.docx[/word]"); poCtrl.setWriter(worddoc);//必须
poCtrl.WebOpen("D:\\TongZhi008.docx", OpenModeType.docNormalEdit, "张三");

pageoffice6 实现在线模板套红的更多相关文章

  1. View Components as Tag Helpers,离在线模板编辑又进一步

    在asp.net core mvc中增加了ViewComponent(视图组件)的概念,视图组件有点类似部分视图,但是比部分视图功能更加强大,它更有点像一个控制器. 使用方法 1,定义类派生自View ...

  2. 关闭WPS启动时显示的在线模板

    关闭WPS启动时显示的在线模板 以WPS2016为例,如下图: 操作步骤如下: ①点击在线模板页面右下方的"设置"选项 ②"设置"界面打开后,选择启动WPS默认 ...

  3. 萌新在线模板--keyboarder_zsq

    好像马上就要出去打铁了QAQ,所以是不是要做个模板带过去也玩一玩? 那就做吧... 标题就设为萌新模板吧...各种萌新讲解对吧.... 图论 拓扑排序 最短路 最小生成树 二分匹配 强连通Tarjan ...

  4. WPS 去掉自动打开的文档漫游和在线模板

    关闭文档漫游  在cmd(命令提示符)中输入regedit.exe回车,将弹出”注册表编辑器“,选择HKEY_CURRENT_USER>>Software>>Kingsoft& ...

  5. ACM在线模板

    转载自:https://blog.csdn.net/f_zyj/article/details/51594851 Index 分类细则 说起分类准则,我也是很头疼,毕竟对于很多算法,他并不是单调的,而 ...

  6. 很不错的在线Office控件:IWebOffice与SOAOffice

    http://blog.csdn.net/cjh200102/article/details/17220441 iWebOffice2003文档控件 iWebOffice2003网络文档中间件能够在I ...

  7. 在线office文档编辑NTKO使用心得

    目录 前言 什么是ntko 准备工作 实战演练 总结 一.前言 Web开发中经常需要用到在线处理office文档的功能,现在市面上有一些常用的Web页面调用显示Office的控件技术,用起来很方便.有 ...

  8. 在线制作h5

    在线制作h5 官网:http://www.godgiftgame.com 在线制作h5首页预览效果图如下: 一.主要功能区域主要功能区域分布在上中左右三个地方,1.上面区域是功能选择区,包括图片素材. ...

  9. POJ 1330 Nearest Common Ancestors(LCA模板)

    给定一棵树求任意两个节点的公共祖先 tarjan离线求LCA思想是,先把所有的查询保存起来,然后dfs一遍树的时候在判断.如果当前节点是要求的两个节点当中的一个,那么再判断另外一个是否已经访问过,如果 ...

  10. NancyFX 第四章 Nancy快速上手 (使用Nancy模板)

    在我们进一步深入学习Nancy之前,我们先快速的了解下Visual Studio下的Nancy模板. 采用Nancy模板,创建一个Nancy项目就像我们创建MVC应用或winForm应用一样简单,只需 ...

随机推荐

  1. 关于pwn题的栈平衡中ret的作用

    以nssctf里的where_is_my_shell为例 题目提供了一个system函数,和一个buf数组.数组的栈空间如图所示,这里不讨论怎么解题,只说明payload里的ret的作用. 假设没有r ...

  2. 1开幕在即 | “万物互联,使能千行百业”2022开放原子全球开源峰会OpenAtom OpenHarmony分论坛

    7月27日下午,聚焦开源产业与生态的2022开放原子全球开源峰会OpenAtom OpenHarmony分论坛将在北京亦创国际会展中心盛大开幕. 作为OpenHarmony工作委员会联合生态合作伙伴为 ...

  3. SQline安装

    SQLite 安装 SQLite 的一个重要的特性是零配置的,这意味着不需要复杂的安装或管理.本章将讲解 Windows.Linux 和 Mac OS X 上的安装设置. 在 Windows 上安装 ...

  4. 【实变函数】四、Lebesgue积分

    [实变函数]4. Lebesgue积分 本文介绍Lebesgue积分的定义,并给出积分的一些常用性质.注意Lebesgue积分的定义是从非负函数向一般函数扩展的,这依托于一般函数的分解\(f(x)=f ...

  5. Windows Server之KMS

    KMS是什么? KMS全称是Key Management Service,本身就是微软官方提供的一种激活方式,通常用于大型组织客需要激活的客户端数量不固定的情况. 正常情况下,激活Windows系统需 ...

  6. Python - PEP572: 海象运算符

    海象运算符 PEP572 的标题是「Assignment Expressions」,也就是「赋值表达式」,也叫做「命名表达式」 不过它现在被广泛的别名是「海象运算符」(The Walrus Opera ...

  7. 浏览器端实现类似input限制输入两位小数,输入时光标从输入位置移动到最后

    1.问题描述展示 示例代码所做限制为不允许输入字母d,其他限制规则可以根据需求自己调整,使用React编写,其他框架或原生均可根据该代码理解原理进行转变,特意使用了中文键盘可以看到输入框下面白色框闪出 ...

  8. 力扣176(MySQL)-第二高的薪水(中等)

    题目: id 是这个表的主键.表的每一行包含员工的工资信息. 编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 .如果不存在第二高的薪水,查询应该返回 null . 查询结果如下 ...

  9. 从 2018 年 Nacos 开源说起

    2018 年夏天 国内微服务开源 领域,迎来了一位新成员.此后,在构建微服务注册中心和配置中心的过程中,国内开发者多了一个可信赖的选项. Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务 ...

  10. SAE助力「海底小纵队学英语」全面拥抱Serverless,节省25%以上成本

    简介: 阿里云Serveless应用引擎SAE 具备免运维IaaS.按需使用.按量计费.低门槛服务应用上云,并且支持多种语言和高弹性能力等特点,刚好完美解决了客户长期以来运维复杂.资源利用率不高.开发 ...