pageoffice多用户同时在线编辑word文档

发布时间 2023-10-11 17:09:34作者: 爱吃苹果皮

转载:多用户同时编辑

多用户同时编辑

注意

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

总体来说,各种Web系统中的Word文档在线处理大体可以分为以下四种流转处理方式:

  • A用户编辑完,流转给B用户修改,再流转给C用户修改,直到最后。每个用户都是针对全文修改的,如果需要在这一篇文档中能区分不同用户分别在文件中做了哪些修改,就需要留痕功能,PageOffice提供了强制留痕功能可以满足此需求,详细请参考强制留痕模式编辑
  • A用户起草文件,流转给B用户修改B用户负责的部分,再流转给C用户修改C用户负责的部分,B用户和C用户负责的部分不存在交叉的情况,而且每个用户都不希望别人改自己负责的部分,这种情况下使用PageOffice提供的控制编辑区域功能即可。
  • A用户起草文件,同时流转给B、C用户,两个用户都可以看到文档,还希望在这种情况下不限制用户的编辑顺序,甚至两用户可以同时打开文档进行编辑,但是B用户和C用户的编辑区域不交叉,每个人都编辑文档中各自负责的段落或章节,此时就可以使用本文所讲的多用户同时编辑功能。
  • A用户起草文件,同时流转给B、C用户,两个用户同时打开文档进行全文不限制区域的编辑,两用户可以实时的看到其他用户编辑的内容,甚至B用户插入或删除了大段的内容,影响到C用户的编辑焦点光标位置到处乱跳,甚至导致C用户都找不到自己的光标位置,如果参与同时编辑的用户还不止两个,甚至更多,那么这种影响会更严重,这种情况就属于各种互联网云文档产品所宣传的协同编辑或同时编辑,详细请参考云文档同时编辑功能存在的问题。PageOffice不支持此场景,因为这种同时实时编辑方式只是看起来美好,而在实际使用过程中存在的严重问题,多人同时编辑一个文档时会引起严重的错乱,一个用户对文档的增删改操作会影响到其他用户的内容和正在查看的视图界面,比如领导查看文档的同时,有其他人在编辑,看到的内容在不断的上下左右“抖动”,或者不同部门之间协作的时候也是这样,有人正在编写文档中的设计部分,有人同时处理文档中的法务问题,由于设计部分的内容插入了一张大的图片,法务人员正在查看和编辑的法律条款内容忽然往下“跑了”,甚至完全看不到了,需要重新翻页等各种问题,用户体验非常不好。在实际项目开发中,还是以前面三种流转处理方式居多,即使开发人员费尽心思实现了这个功能,也很少有人愿意使用,所以我们不推荐使用这种方式在线处理Word文档。

目前网络上的各种云文档产品一般采用HTML、CSS、JavaScript等技术可以用于实现文档的布局、样式、交互等方面的实现,例如实现文本输入、格式化、插入图片、表格等模拟真正的Word文档;后端采用文档解析技术,将Word文档和HTML互相转换;实现多人同时在线编辑功能时再调用一些实时协同编辑技术,例如WebSocket等,所以严格来说,此类在线云文档产品处理的是HTML,并不是真正的Word文档,从云文档系统导出的Word文档都是HTML格式转化出来的,因此云文档中的文档内容格式、样式、布局、排版、页码、总页数等与真正的Word文档格式有很大的出入。

PageOffice提供的多用户同时编辑文档的功能是基于Word文档局部编辑技术的。文档同时流转给B、C用户后,当B用户打开文件,设置B用户负责的段落区域可以编辑,其他段落章节全部只读;当C用户打开文件,设置C用户负责的段落区域可以编辑,其他段落章节全部只读,所以也无需使用留痕技术。B用户保存文件时,只保存B用户编辑区域中的内容为一个独立的子Word文件,当前打开的文档并不保存,当C用户打开文件时,把B用户编辑的子Word子文档再重新插入到当前文档中,但是C用户只能查看B用户编辑的内容,不能修改。C用户保存文件也是同理保存为一个子Word文件,当前文档不保存,B用户打开文件也是只能查看插入到当前文档中的C用户编辑的Word子文档内容,不能修改C用户的数据。这样一来,两个用户即使同时打开编辑同一篇文档,并先后保存,内容也不会互相覆盖,做到互不影响,实现同时编辑文档的效果。

在正式项目的Word文档处理环节,文档流转都是从一个用户到另一个用户串行处理的,使用同时编辑文档的目的大都是为了提高多部门合作编辑文件的效率,并行处理文档,所以希望在时间上不要有先后顺序的限制,不同部门的人员就无需要互相等待了,本质上还是各人负责各自的段落章节,所以就需要使用PageOffice提供的多用户同时编辑文档的功能了。

接下来以B、C两个用户同时编辑一份采购合同来举例说明一下PageOffice实现同时编辑文档的效果。假设B用户是销售人员,负责编辑合同中产品相关的内容;C用户是法务,负责编辑合同中的法律条款,分别对应了合同模板中的两个数据区域PO_Product和PO_Law,如下图所示:

编写代码判断不同用户打开文件时,设置不同的编辑区域:

PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
WordDocument wordDoc = new WordDocument();
wordDoc.openDataRegion("PO_JiaFang").setValue("北京XX科技有限公司");
wordDoc.openDataRegion("PO_YiFang").setValue("上海YY技术有限公司");
// hetong_product.doc和hetong_law.doc来自于saveData方法保存时得到的Word片段。
DataRegion dataRegion1 = wordDoc.openDataRegion("PO_Product");
dataRegion1.setValue("[word]D:\\documents\\hetong_product.doc[/word]"); // 插入Word片段到当前文档
DataRegion dataRegion2 = wordDoc.openDataRegion("PO_Law");
dataRegion1.setValue("[word]D:\\documents\\hetong_law.doc[/word]");
if (loginUser == 'B用户'){
  dataRegion1.setEditing(true); // 设置数据区域为可编辑状态
  dataRegion1.setSubmitAsFile(true); // 设置保存文件时,数据区域中的内容抽取为子Word文件提交
} else if (loginUser == 'C用户') {
  dataRegion2.setEditing(true);
  dataRegion2.setSubmitAsFile(true);
}
poCtrl.setWriter(wordDoc);//必须
poCtrl.setSaveDataPage("saveData");
poCtrl.WebOpen("D:\\documents\\hetong.docx", OpenModeType.docSubmitForm, "张三");

当B用户打开编辑产品相关数据时的效果如下图所示:

当C用户打开编辑法律条款相关内容时的效果如下图所示:

保存文件时,在后台方法saveData中创建com.zhuozhengsoft.pageoffice.wordreader命名空间中的WordDocument对象,提取数据区域中的子文档。

WordDocument doc = new WordDocument(request, response);
byte[] bWord;
// 数据区域PO_Product中的内容抽取为子Word文件:hetong_product.doc
DataRegion dr1 = doc.openDataRegion("PO_Product");
bWord = dr1.getFileBytes();
FileOutputStream fos1 = new FileOutputStream("D:\\documents\\hetong_product.doc");
fos1.write(bWord);
fos1.flush();
fos1.close();
// 数据区域PO_Law中的内容抽取为子Word文件:hetong_law.doc
DataRegion dr2 = doc.openDataRegion("PO_Law");
bWord = dr2.getFileBytes();
FileOutputStream fos2 = new FileOutputStream("D:\\documents\\hetong_law.doc");
fos2.write(bWord);
fos2.flush();
fos2.close();
doc.close();

因此,在使用PageOffice提供的同时编辑功能时,B用户在自己的区域编辑文档,不会实时传导到C用户或其他用户,不影响其他用户的编辑操作,如果某用户想查看其他用户编辑了哪些内容,那么保存并重新打开文件即可,所以不会造成错乱的用户体验。