PageOffice 开发者中心 PageOffice 开发者中心
首页
文档
  • 后端Java手册 (opens new window)
  • 后端.netcore手册 (opens new window)
  • 前端JavaScript手册 (opens new window)
下载
购买 (opens new window)
首页
文档
  • 后端Java手册 (opens new window)
  • 后端.netcore手册 (opens new window)
  • 前端JavaScript手册 (opens new window)
下载
购买 (opens new window)
  • 开始

  • 通用控制

  • Word

    • 常用控制

      • 强制留痕模式编辑
      • 显示痕迹列表效果
      • 只读打开文档
      • 文件在线安全浏览
      • 比较两个Word文件的内容差异
      • 编辑时禁止拷贝到外部
      • 禁止Word中鼠标右键
      • 多用户同时编辑
      • Word多文件合并
      • 控制Word编辑区域(局部编辑)
      • 添加水印
      • 插入分页符
      • 模板套红
      • 从模板起草文件
        • 创建空白的word、excel、ppt
        • 用户自定义模板中数据区域
        • 用户自定义模板中数据标签
        • 数据区域与数据标签的区别
        • Word全文检索
        • Word套打
        • 锁定文本样式
        • 用前端框架内置对话框在Word中填空填表
        • 保存Word首页为图片
      • 动态填充

      • 用户输入提交

      • JS控制

    • Excel

    • PDF

    • FileMaker

    • PPT

    • 更多

    目录

    从模板起草文件

    # 从模板起草文件

    • 查看本示例演示效果
    • 本示例关键代码的编写位置,请参考“开始 - 快速上手”里您所使用的开发语言框架的最简集成代码

    注意

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

    在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系统中开发的起草文件功能是这样的:给用户提供了一个起草文件的页面(以下图为例),让用户填写各项表单数据,用户选择文件模板为“通知”模板(template_tongzhi.docx),并点击“提交”按钮后,就会在项目的数据库中添加新的文件记录,并执行程序代码从“通知”模板复制出新的文件与新添加的文件记录对应,比如新文件的名称为“TongZhi008.docx”。

    假如通知模板的内容如下图所示:

    • 模板里面包含的数据区域有:
      • 发文单位 PO_FaWenDanWei
      • 年份 PO_NianFen
      • 发文号 PO_FaWenHao
      • 标题 PO_BiaoTi
      • 主题词 PO_ZhuTiCi
      • 打印份数 PO_DaYinFenShu
    • 模板中包含的数据标签有:
      • 发文日期 {#发文日期#}

    注意

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

    注意

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

    1. 调用PageOffice在线打开新建的文件TongZhi008.docx,并创建PageOffice提供的WordDocumentWriter对象动态填充各项数据,比如:发文单位、发文日期、标题、打印份数等到TongZhi008.docx中,生成通知文件的初稿,如下图所示:

    2. 用户编辑通知文件的正文内容,并保存,完成文件的起草工作。如下图所示:

    # 后端代码

    复制通知模板(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());
      
      string templateFile = @"D:\template_tongzhi.docx";
      string newFile = @"D:\TongZhi008.docx";
      File.Copy(templateFile, newFile, overwrite: true);
      
      // Make sure to add code blocks to your code group

      PageOffice在线打开TongZhi008.docx,并调用PageOffice的WordDocumentWriter对象动态填充各项数据

         PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
        
         WordDocumentWriter worddoc = new WordDocumentWriter();
         // 为了代码简单,以下给数据区域赋值常量,正式开发时,可以从数据库中读取数据。
         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日");
        
         poCtrl.setWriter(worddoc);//必须
         poCtrl.WebOpen("D:\\TongZhi008.docx", OpenModeType.docNormalEdit, "张三");
        
        PageOfficeNetCore.PageOfficeCtrl poCtrl = new PageOfficeNetCore.PageOfficeCtrl(Request);
        
        PageOfficeNetCore.Word.WordDocumentWriter doc = new PageOfficeNetCore.Word.WordDocumentWriter();
        // 为了代码简单,以下给数据区域赋值常量,正式开发时,可以从数据库中读取数据。
        doc.OpenDataRegion("PO_FaWenDanWei").Value = "某某科技行政办公室";
        doc.OpenDataRegion("PO_NianFen").Value = "2023";
        doc.OpenDataRegion("PO_FaWenHao").Value = "008";
        doc.OpenDataRegion("PO_BiaoTi").Value = "印发XX管理制度";
        doc.OpenDataRegion("PO_ZhuTiCi").Value = "管理 制度 通知";
        doc.OpenDataRegion("PO_DaYinFenShu").Value = "10";
        // 发文日期为数据标签
        doc.OpenDataTag("{#发文日期#}").Value = "2023年5月10日";
        
        poCtrl.SetWriter(doc);//必须
        poCtrl.WebOpen("D:\\TongZhi008.docx", PageOfficeNetCore.OpenModeType.docNormalEdit, "张三");
        
        // Make sure to add code blocks to your code group

        # 前端代码

        本示例无前端关键代码。

        上次更新: 2025/07/21, 15:21:36
        PageOffice | Copyright © 2013-2026 卓正软件 京ICP备12010902号-2 京公网安备 11010502019270号
        • 跟随系统
        • 浅色模式
        • 深色模式
        • 阅读模式