总体来说,各种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用户或其他用户,不影响其他用户的编辑操作,如果某用户想查看其他用户编辑了哪些内容,那么保存并重新打开文件即可,所以不会造成错乱的用户体验。

参考链接:多用户同时编辑

pageoffice6 版本在线打开word 文件,实现多用户同时编辑的更多相关文章

  1. [转载]]Java开发如何在线打开Word文件

    此方案使用了PageOffice产品实现在线打开Word文档: 1. 首先从PageOffice官网下载产品开发包,http://www.zhuozhengsoft.com/dowm/ ,下载Page ...

  2. [原创]Java开发如何在线打开Word文件

    此方案使用了PageOffice产品实现在线打开Word文档: 1. 首先从PageOffice官网下载产品开发包,http://www.zhuozhengsoft.com/dowm/ ,下载Page ...

  3. SharePoint 2013 用IE11在线打开Word文档报错

    问题: 测试结果: ie11会报错,ie10和以下版本不会报错,chrom不会报错. jindahao

  4. android获取一个用于打开Word文件的intent

    近期在做项目使用webview显示后,有写文档须要打开,找了一些资料,研究了一下,弄出来了! 以下贴一下主要代码: param为文档的主要路径 public static Intent getWord ...

  5. [转载]java在线比较两个word文件

    一.项目背景 开发文档管理系统或OA办公系统的时候,实现在线处理word文档的功能比较容易,但是也经常会有客户提出文档版本管理的需求,这就需要同时在线打开两个word文件,对比两个不同版本的word文 ...

  6. [原创]java在线比较两个word文件

    一.项目背景 开发文档管理系统或OA办公系统的时候,实现在线处理word文档的功能比较容易,但是也经常会有客户提出文档版本管理的需求,这就需要同时在线打开两个word文件,对比两个不同版本的word文 ...

  7. Java 如何在线打开编辑word文档?

    在一般的OA项目中经常会遇到在线处理Office文档的需求,先下载文件,编辑保存后再选择文件上传的方式太过原始,在如今早已是Office Online的时代,没有用户能接受这种蹩脚的操作方式. 虽然微 ...

  8. 在线打开,浏览PDF文件的各种方式及各种pdf插件------(MS OneDrive/google drive & google doc/ github ?raw=true)

    在线打开,浏览PDF文件的各种方式: 1 Google drive&doc   (国内不好使,you know GFW=Great Firewall) 1. google drive: 直接分 ...

  9. [原创]java对word文档的在线打开

    一.材料准备 百度一下:PageOffice,从官网下载PageOffice for Java.压缩包文件: 二. 实现步骤: 1. 打开“集成文件”目录,拷贝“WEB-INF\lib”目录中的pag ...

  10. Vue中如何实现在线预览word文件、excel文件

    一.查看word 1.引用mammoth.js (1)安装 npm install --save mammoth 1 npm install --save mammoth (2)引入import ma ...

随机推荐

  1. OpenHarmony Docker移植实践

     Docker简介 从操作系统诞生之日起,虚拟化技术就不断的演进与发展,结合目前云原生的发展态势,容器无疑是其中的重要一环. Docker是一个开源的软件项目,可以在Linux操作系统上提供一层额外的 ...

  2. Unity 音频资源优化

    1.声道设置 (1).不设置 单声道 音频大小为下图 (2).设置单声道 音频大小为下图 2.加载类型 (1).Decompress On Load 使用内存8.1M (2).Compressed I ...

  3. sql 语句系列(记录时间差)[八百章之第十八章]

    计算当前记录和下一条记录之间的日期差 关键点在于如何获得下一条日期. mysql 和 sql server select x.*,DATEDIFF(day,x.HIREDATE,x.next_hd) ...

  4. 升级gradle:Could not find method jackOptions() for arguments

    前言 这是我在升级gradle发生的错误. 解决 原因是被废弃了: 删除: jackOptions { enabled true } 解释一下什么是jack: Jack 是 Java Android ...

  5. 将项目封装进docker进行迁移和使用

    首先要理解docker的基本使用,本文不做过多阐述,博主也对docker没有了解透彻. 这里列一下docker的基本命令: docker info # 查看docker信息 docker -v # 查 ...

  6. 快速获取使用dblink的视图的全部字段

    快速获取使用dblink的视图的全部字段 默认情况下,使用dblink连接的视图在PL/SQL是没法通过代码助手获取全部的字段的 如果要获取全部字段的话,可以使用一个奇怪的方法 对要获取的使用dbli ...

  7. 阿里云2020上云采购季,你的ECS买好了吗?

    阿里云2020上云采购季,超级品类日,天天有爆款. 今日爆款推荐:云服务器. 重磅推荐两款,限时抢购. 新品共享型s6: 企业级共享型n4: 想看更多云产品,来阿里云采购季: https://www. ...

  8. Serverless 场景下 Pod 创建效率优化

    简介: 众所周知,Kubernetes 是云原生领域的基石,作为容器编排的基础设施,被广泛应用在 Serverless 领域.弹性能力是 Serverless 领域的核心竞争力,本次分享将重点介绍基于 ...

  9. dotnet 使用 TaskTupleAwaiter 同时等待多个任务简化代码写法

    在某些业务逻辑下,需要同时等待多个任务执行完成,才能继续往下执行后续逻辑.等待任务执行的逻辑,大部分情况下需要使用到 Task.WhenAll 方法,代码行数不少.另外,在需要获取多个异步任务的返回值 ...

  10. WPF dotnet core 的 Blend SDK Behaviors 库

    之前版本是通过安装 Blend SDK 支持 Behaviors 库的,但是这个方法都是通过引用 dll 的方式,不够优雅.在升级到 dotnet core 3.0 的时候就需要使用 WPF 官方团队 ...