国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版控制Word编辑区域(局部编辑)

本示例关键代码的编写位置
Vue+Springboot

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

在实际项目开发中,以下场景可能会用到Word局部编辑功能:

  • 合同审批
  • 公文流转
  • 策划设计报告
  • 汇签单
  • 招投标(标书文件)
  • 其他,有模板且需要不同人员协作编辑的场景

PageOffice使用表单模式 docSubmitForm 打开Word文件之后,只有设置了Editing属性为true的数据区域部分是可以编辑的,Word中的其他部分都是只读不可编辑的,所以利用此特性就可以控制Word文件编辑区域,只要保存的时候不处理提交的数据,只是保存文件的话,就实现了局部编辑功能。

控制编辑区域实现局部编辑的功能,通常用在以下两个方面:

  • 只是为了控制Word文档中哪些位置属于可编辑区域,避免用户误操作修改、或故意修改编辑区域以外的内容;
  • 多人负责编辑Word文档中不同章节的情况下,控制不同用户编辑各自不同的区域;
    以下我们就合同审批和公文流转两个场景来举例说明,PageOffice是如何使用局部编辑功能分别实现这两个需求的。

注意
“数据区域”是指word文件中名称以“PO_”开头的书签。

合同审批的需求

某公司要在线上起草采购合同,合同模板是固定的,合同条款几乎固定不变,只有签订合同的供货单位名称和担保人是根据实际情况变动的。因此,在线上制作合同时,只需要让合同中那些可变的区域可编辑,其他位置则不能编辑,这时就需要用到PageOffice的局部编辑功能。

在实际项目中,合同审批肯定会用到更多的数据区域,本文为了简明扼要,所以仅以有限的几个数据区域来举例说明。

首先,制作一个销售合同模板,比如:D:\template1.docx,里面包含了购货单位、供货单位、合同编号、产品名称、担保人等数据区域,如下图所示:
image

然后,起草文件时,编程控制用表单模式docSubmitForm打开Word文件,并调用WordDocument对象动态填充从Web系统数据库中获取的所有数据到Word模板,生成合同文件的初稿,同时设置供货单位(PO_Supplier)和担保人(PO_Guarantor)两个数据区域的Editing属性为true,即实现除供货单位名称和担保人之外的所有内容都是只读不可编辑的。做如下编码:

PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);

WordDocument wordDoc = new WordDocument();
//打开数据区域,openDataRegion方法的参数代表Word文档中的书签名称
wordDoc.openDataRegion("PO_Buyer").setValue("北京幻想科技有限公司");
wordDoc.openDataRegion("PO_No").setValue("HT20230211");
wordDoc.openDataRegion("PO_ProductName").setValue("三防热敏标签纸");

DataRegion  supplierNameDr = wordDoc.openDataRegion("PO_Supplier");
supplierNameDr.setValue("湖北某某有限公司");
supplierNameDr.setEditing(true); // true代表当前数据区域可编辑,false为不可编辑。默认值是false

DataRegion  guarantorDr = wordDoc.openDataRegion("PO_Guarantor");
guarantorDr.setValue("张三");
guarantorDr.setEditing(true);

poCtrl.setWriter(wordDoc);//必须
poCtrl.setSaveFilePage("saveFile"); // 设置保存文件的接口地址
poCtrl.WebOpen("D:\\template1.docx", OpenModeType.docSubmitForm, "李四");

生成的合同初稿如下图所示:
image

保存合同文件时,在SaveFilePage属性指向的地址接口中,调用FileSaver对象保存合同文件为正式的文件名,比如:hetong001.docx,后面的流转和审核环节对hetong001.docx进行处理即可。

FileSaver fs = new FileSaver(request, response);
fs.saveToFile("D:\\hetong001.docx");
fs.close();

这样一来,合同起草人员或合同流转审阅环节的其他人员,就只需要根据具体情况修改合同中相关数据,无需担心误操作修改了与Web系统紧密相关的关键数据(如“合同编号”),或其他关键合同条款。最后合同的审核环节,领导只需要关注合同中可编辑区域的数据,无需逐一核对全文数据,不用担心可编辑区域以外的其他内容发生变动,极大的提高了领导审核合同的效率。

公文流转的需求

起草人起草文档,然后文档在部门之间流转(或在人员之间流转),一个时常会遇到的需求就是,要求A部门人员不能编辑B部门区域的内容,反之亦然,否则就不能划清部门之间的责任。总的来说就是不同的人负责编辑文章中不同的区域,所以就需要控制编辑区域的功能。此功能基本上属于OA系统、文档系统、合同管理等各种类型的文档审核流转的核心功能。比如:打开公司公文,里面包含两个数据区域“研发部意见”和“销售部意见”,名称分别为:PO_YanFa、PO_XiaoShou,实现A用户打开公文后只能编辑研发部意见,B用户打开公文后只能编辑销售部意见,可以做如下编码:

PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);

WordDocument wordDoc = new WordDocument();

if (loginUser.equals("A用户")){
  wordDoc.openDataRegion("PO_YanFa").setEditing(true); // 设置数据区域为可编辑状态
} else if (loginUser.equals("B用户") {
  dwordDoc.openDataRegion("PO_XiaoShou").setEditing(true); 
}

poCtrl.setWriter(wordDoc);//必须
poCtrl.setSaveFilePage("saveFile");
poCtrl.WebOpen("D:\\documents\\hetong.docx", OpenModeType.docSubmitForm, "张三");

当A用户打开公文时只能编辑研发部意见的效果,如下图所示(只有黄色中括号内的区域可以编辑):
image

当B用户打开公文时只能编辑销售部意见的效果,如下图所示(只有黄色中括号内的区域可以编辑):
image

编辑区域的定义

  • 方法一:编辑Word模板,即在Word文档中添加书签。在D盘根目录下新建Word文件,比如:D:\template1.docx,打开文件用光标选中需要标记为书签的文字,比如“[公司名称]”,然后点Word菜单中的“插入”-“书签”,就会弹出一个标题为“书签”的对话框(如下图所示),输入新书签的名称,注意:书签名必须以“PO_”开头,并由字母和数字组成,但中间不能有空格。点右侧的“添加”按钮,新的书签名将出现在下面的列表中。此方法适用于,模板在项目开发时就固定下来不再修改的场景。

  • 方法二:请参考“用户自定义模板中数据区域”章节。此方法适用于,在项目发布运行后,用户还需要修改调整模板、甚至新建模板的场景。

参考链接:控制Word编辑区域(局部编辑)

posted on 2024-06-06 15:36  qianxi  阅读(6)  评论(0编辑  收藏  举报