总体来说,各种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. #树状数组,dp#洛谷 3506 [POI2010]MOT-Monotonicity 2

    题目 给出\(N\)个正整数\(a[1..N]\),再给出\(K\)个关系符号(>.<或=)\(s[1..k]\). 选出一个长度为\(L\)的子序列(不要求连续),要求这个子序列的第\( ...

  2. SynchronousQueue详解

    目录 简介 举例说明 总结 SynchronousQueue详解 简介 SynchronousQueue是BlockingQueue的一种,所以SynchronousQueue是线程安全的.Synch ...

  3. 1开幕在即 | “万物互联,使能千行百业”2022开放原子全球开源峰会OpenAtom OpenHarmony分论坛

    7月27日下午,聚焦开源产业与生态的2022开放原子全球开源峰会OpenAtom OpenHarmony分论坛将在北京亦创国际会展中心盛大开幕. 作为OpenHarmony工作委员会联合生态合作伙伴为 ...

  4. 为 Hugging Face 用户带来无服务器 GPU 推理服务

    今天,我们非常兴奋地宣布 部署到 Cloudflare Workers AI 功能正式上线,这是 Hugging Face Hub 平台上的一项新服务,它使得通过 Cloudflare 边缘数据中心部 ...

  5. Redis 02 基础命令

    数据库 Redis 默认有 16 个数据库. 默认使用的是第 0 个数据库. 不同数据库存不同的值. 切换数据库 select 127.0.0.1:6379> select 1 OK 127.0 ...

  6. 【直播回顾】Hello HarmonyOS应用篇第六课——短视频应用开发

    由HDE夏德旺老师主讲的Hello HarmonyOS进阶系列应用篇第六课<短视频应用开发>, 已于6月8日晚上 19 点在HarmonyOS社群内成功举行. 本节课夏德旺老师带领大家了解 ...

  7. Kotlin 使用协程编写高效的并发程序

    概念: 轻量级的线程 协程允许我们在单线程模式下模拟多线程编程的效果,代码执行时的挂起与恢复完 全是由编程语言来控制的,和操作系统无关.这种特性使得高并发程序的运行效率得到了极大的提升. 依赖库: d ...

  8. byte[]类型与datetime日期转换

    在C#中,Timestamp通常表示为一个长整型(long)变量.这是因为它表示自1970年1月1日00:00:00 UTC以来的毫秒数.然而,在某些情况下,例如在处理数据库中的Timestamp时, ...

  9. 05_理解MVVM模型

    总结: MVVM模型:         1.M:模型(Model):data中是的数据         2.V:视图(View):模板代码         3.VM:视图模型(ViewModel):V ...

  10. 科学地花钱:基于端智能的在线红包分配方案 (CIKM2020)

    简介: 红包是电商平台重要的用户运营手段,本文将介绍1688基于端智能技术开发的two-stage红包分发方案.这一方案持续在线上生效,相较于原有算法有明显提升. 一.前言 本文是作者在1688进行新 ...