首页 > 其他分享 >pageoffice模板套红

pageoffice模板套红

时间:2023-09-06 17:13:09浏览次数:33  
标签:文件 docx 套红 用户 pageoffice PO 模板

转载:模板套红

模板套红

注意

本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。

在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”),并让用户在线打开此文件,编辑通知的正文内容。

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

  2. 用户选择通知模板,对文件进行套红。假如通知模板文件为: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, "张三");

      前端代码

      本示例无前端关键代码。

      标签:文件,docx,套红,用户,pageoffice,PO,模板
      From: https://www.cnblogs.com/lhl77/p/17682849.html

      相关文章

      • 使用 vue 渲染静态模板
        最近再一次需要做纯静态页面(无任何脚本语言,只保留css和html),以往我直接使用ejs生成,但是工作中一直使用jsx和vue来组装页面,就突发奇想,难道react、vue不能只渲染纯静态页面吗?有了这个想法,我就想验证下可行性,万能百度开始,找了一圈,发现基本都是需要脚本依赖的,这就意味着必......
      • 金蝶云星空创建带分录的业务单据模板(协同开发云)
         业务对象的创建方式有新建、复制、继承三种:新建:基于空白对象创建,不受任何约束,灵活度高,元素、菜单都需要自行添加。常用于动态表单、移动业务的开发。复制:原对象复制出新的业务对象,对原对象与新对象的改动不会相互影响。常用于动态表单、移动业务的开发。继承:继承原对象的元......
      • 模板字符串
        点击查看代码functionrender(template,data){constreg=/\{\{(\w+)\}\}/;//模板字符串正则if(reg.test(template)){//判断模板⾥是否有模板字符串constname=reg.exec(template)[1];//查找当前模板⾥第⼀个模板字符串的字段template=template.replace(reg,......
      • flask设置静态文件目录、模板目录
        fromflaskimportFlask,render_templateapp=Flask(import_name=__name__,static_url_path='/',static_folder='static',template_folder='templates')#添加html访问路由@app.route('/')defblog():retur......
      • STL标准模板之容器
        一、vector向量容器头文件:#include<vector>采用顺序结构存储数据,可以使用下标进行随机访问,有时候也叫数组容器(C++11中增加了array容器,定长数组容器,相比普通数组它是类类型,增加成员函数,提高安全性)vector是可变长的顺序表结构,可以自动扩容,容器中的元素存储在连续内存,支......
      • Vue-----模板插值-----(v-once、v-html、v-bind使用)
        1、v-once当组件在进行变量插值时只会插值一次。某些情况下,某些组件的渲染是由变量控制的,但是我们想让它一旦渲染后就不能够再被修改,可以是由v-once来实现<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="widt......
      • C#中单例模板
        泛型单例/***泛型单例模板where限制这个单例类必须要能被new出来*/publicclassSingleton<T>:IDisposablewhereT:new(){privatestaticTinstance;publicstaticTInstance{get{if(instance==null)instance=new......
      • 洛谷P3808 【模板】AC 自动机(简单版)题解 AC自动机模板题
        题目链接:https://www.luogu.com.cn/problem/P3808AC自动机模板题。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e6+5;structNode{intson[26],fail,id;Node(){}Node(int_id){memset(son,0,sizeof(son));......
      • VSCode-用户代码片段,代码模板
        项目过渡到vue3,为了提高开发效率,减少重复代码编写,通过VSCode编辑器的CodeSnippets完成代码。实现效果,输入关键词Index,回车,会自动出现自定义的代码段。1.打开VSCode,点击文件=》首选项-》配置用户代码片段 2.新建全局代码片段文件,输入文件名称,并回车  3.修改模板......
      • jetbrains GoLang设置编写proto文件的实时模板
        具体步骤1. 首先,先创建一个模板组,我这里创建为"proto"。2.下面这张图是我的模板组中的内容3.具体实时模板缩写:enum描述:enumname{}模板文字:enum$name${$END$}适用于:协议缓存区中的Other缩写:import描述:import"";模板文字:import"$file$";$END$适用......