[原创]Java在线编辑word文档调用PageOffice实现并发控制
1.功能介绍
PageOffice的并发控制功能用来解决多个用户在线编辑同一篇文档可能造成的互相覆盖修改结果的技术难题。
B/S架构下用户访问都是并发的,也就是说经常会出现同时N个用户对一个服务器页面发出请求,这就有可能同一个文档被多个用户同时打开进行编辑。为什么会出现互相覆盖呢?举个简单例子,例如A用户先访问页面打开了一个文档开始编辑,这时B用户访问相同的页面打开了同一个文档也开始编辑,B用户可能很快就完成了文档修改工作并且保存到服务器。随后A用户也完成了工作并保存文档到服务器。这时,服务器上的这个文档已经变成了A用户修改的最后结果,B用户的修改被A的保存操作覆盖从而消失了。
PageOffice的并发控制能够保证同一时间同一篇文档只能由一个人打开,而这样复杂的控制只需要开发者简单对TimeSlice属性赋值即可实现。无论打开的文档是存放在数据库还是存在物理磁盘里,只要对此文档设置了并发控制,那么实现的效果都是只有当前用户可以对此文档进行编辑、保存等操作,其他用户只能以只读的形式打开。在并发控制期间,其他用户有三个选择,分别是“终止”、“重试”和“忽略”。选择“终止”,则关闭当前提示对话框,对此文档不进行任何操作;选择“重试”,则可以了解当前操作用户的编辑时间是否已经用完,同时可以看到当前操作用户的剩余编辑时间;选择“忽略”,则以只读方式打开此文档,即只能阅读此文档,不能对此文档进行编辑、修改、保存等操作。
2. 如何实现并发控制
在WebOpen之前设置属性TimeSlice。例如设置PageOfficeCtrl1.TimeSlice = 4;那么登录用户对这个文档的编辑时间即为4分钟。用户必须在编辑时间结束之前,进行编辑、保存等操作,在编辑时间结束之后,用户已经编辑的未保存的内容将无法保存。
PageOfficeCtrl1.TimeSlice = 4;//对当前文档开启并发控制
TimeSlice只对当前WebOpen打开的文档有效,如果不赋值,就不进行并发控制。默认值是0,表示不进行并发控制。
注意:1.这里所说的同一份文档,以WebOpen的第一个参数为判断标准。如果两次WebOpen的第一个参数完全相同则视为同一个文档,如果不同则视为不同文档。
2.如果两次WebOpen的第一个参数完全相同,第三个参数(用户名)也完全相同,则视为用户修改编辑文档的同时参考原来的文件,属于特殊需要,这时并发控制不起作用。
WebOpen直接打开文档或打开动态页面输出的文档,都可以实现并发控制:
(1)直接打开文档,WebOpen的第一个参数是office文件名结尾。
例如用户a的打开文档的操作如下:
PageOfficeCtrl1.TimeSlice = 4;
PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "a");
用户b的打开文档的操作如下:
PageOfficeCtrl1.TimeSlice = 4;
PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "b");
那么如果对doc/abc.doc这个文档设置了并发控制的话,当a打开此文档后,b只能以只读方式打开此文档,直到a的控制时间结束后,b才可以对此文档进行编辑。
(2)通过动态页面打开文档,WebOpen的第一个参数是一个动态页面的地址,还带有参数值。
例如用户a的打开文档的操作如下:
PageOfficeCtrl1.TimeSlice = 4;
PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "a");
用户b的打开文档的操作如下:
PageOfficeCtrl1.TimeSlice = 4;
PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "b");
那么如果对这个a.aspx?id=1地址下载的文档设置了并发控制的话,当a打开此文档后,b只能以只读方式打开此文档,直到a的控制时间结束后,b才可以对此文档进行编辑。
3.什么情况下,并发控制不起作用了?
同一个office文件,有两个不同的url地址都可以下载这个文件,当两个用户使用不同的地址打开同一个office文件的时候,并发控制就不起作用了。
(1)例如都是两个不同的动态页面地址都可以下载同一个文件:地址a.aspx?id=1和地址b.aspx?id=1下载的是服务器端同一个文档,用户a的打开文档的代码是:
PageOfficeCtrl1.TimeSlice = 4;
PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType.docAdmin, "a");
用户b的打开文档的代码是:
PageOfficeCtrl1.TimeSlice = 4;
PageOfficeCtrl1.WebOpen("b.aspx?id=1", PageOffice.OpenModeType. docAdmin, "b");
这样虽然“a.aspx?id=1”和“b.aspx?id=1”打开的是同一个文档,但是因为WebOpen的第一个参数值不同,对于PageOffice来说打开文档的URL也不同,PageOffice认为是两个不同的文件,这种情况并发控制就不起作用了。
(2)例如一个用动态页面地址和一个用文档名结尾的URL地址:访问“a.aspx?id=1”下载的文件就是doc/abc.doc,用户a的打开文档的代码是:
PageOfficeCtrl1.TimeSlice = 4;
PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "a");
用户b的打开文档的代码是:
PageOfficeCtrl1.TimeSlice = 4;
PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "b",);
还是因为WebOpen的第一个参数值不同,虽然打开的是同一个文档,但是因为PageOffice认为两个文档的URL不一样,所以并发控制也不起作用。
[原创]Java在线编辑word文档调用PageOffice实现并发控制的更多相关文章
- 在线编辑word文档 可保存到服务器
使用说明:该方法只在office xp 和 2003上 测试通过,2000及以下 版本没试. 注意:你要打开的服务器端的word文档要有写权限.iis要开起 web服务扩展中的webdav为允许 具体 ...
- [原创]Java动态生成word文档(图文并茂)
很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Word模板文档里,这对于大批量生成拥有相同格式排版的正式文件非常有用,这个功能应用PageOffice的基本动态填充功 ...
- [原创]Java动态填充word文档并上传到服务器
一. 需求背景 在一些特殊应用场合,客户希望在服务器上生成文档的同时并填充数据,客户端的页面不显示打开文档,但是服务器上生成文档对服务器压力很大,目前服务器上生成文档第一种就是方式是jacob, 但是 ...
- java 在线拆分 word文档采用什么技术比较好?
在Java项目开发中,偶尔会遇到通过程序动态拆分word文档的需求,由于Java本身不能操作Word文档,在网上也都是讨论如何动态合并word,所以这个需求实现起来相当困难,下面就将近期对于Word文 ...
- 在线编辑word文档代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- [原创]java在线打开PDF文档
步骤一:(涉及到的工具) 访问:http://www.zhuozhengsoft.com/dowm/,从官网下载PageOffice for Java. 步骤二:(配置工程) 1. 解压PageOff ...
- 如何通过 Java 代码隐藏 Word 文档中的指定段落
在编辑Word文档时,我们有时需要将一些重要信息保密. 因此,可以隐藏它们以确保机密性. 在本文中,将向您介绍如何通过 Java 程序中的代码隐藏 Word 文档中的特定段落.下面是我整理的具体步骤, ...
- 编辑word文档过程中输入法无法正常使用
编辑word文档过程中输入法无法正常使用怎么办??有的朋友在使用Word 2010过程中,遇到了这样的问题.每次打开word文档,程序就自动变成英文输入法,中文输入法就退出了,特别是搜狗输入法.即使在 ...
- Java 后台创建word 文档
---恢复内容开始--- Java 后台创建 word 文档 自己总结 网上查阅的文档 分享POI 教程地址:http://www.tuicool.com/articles/emqaEf6 方式一. ...
随机推荐
- SAS中的自动变量
Sas自动变量:由数据步语句自动创建的. _n_ :观测序号: _error_:错误信息变量; _numeric_ :所有数值变量: _character_:所有字符变量; _all_:所有变量; f ...
- [译]RabbitMQ教程C#版 - “Hello World”
[译]RabbitMQ教程C#版 - “Hello World” 先决条件本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需 ...
- android开发笔记之fastboot的使用
fastboot命令大全 在终端中.我们输入: fastboot 对于这些命令.我不解释,慢慢使用.慢慢的就会明确是怎么回事了. android分区 分区 作用 splash1 开机画面.使用Nand ...
- git 操作分支
1. git 查看本地分支:git branch 2. git 查看所有分支:git branch -a 3. git 新建本地分支:git branch branchName 4. git 新建分支 ...
- java中类型的隐式转换
byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double
- .NET C# 【小技巧】控制台程序,运行是否弹出窗口选择!
选中控制台程序项目,右键→属性→应用程序栏→输出类型: 1.Windows 应用程序(不弹出提示框)! 2.控制台应用程序(弹出提示框)! 3.类库(类库生成dll,是不能直接运行的,类库供应用程序调 ...
- 我眼中的Oracle Database Software 和 Oracle Database
我眼中的Oracle Database Software 和 Oracle Database 我喜欢用微软的office软件和word文档(确切的说是:自己写的word文档,能够把这个Word文档想象 ...
- 【文献阅读】Stack What-Where Auto-encoders -ICLR-2016
一.Abstract 提出一种新的autoencoder -- SWWAE(stacked what-where auto-encoders),更准确的说是一种 convolutional autoe ...
- 再看GS线程
再看GS线程 void GameServer::ProcessThreadTry() { ; packet rcvPkt; rcvPkt.data = * ]; //该事件工厂主要创建了两个定时器1. ...
- EasyPlayerPro windows播放器之多窗口播放音量控制方法
EasyPlayerPro-win基础版本的音频播放为单一通道播放,即同一时间仅允许一个通道播放声音,现应客户需求,在基础版本上实现独立的音频播放,即每个通道可同时播放视频和音频; 设计思路 将音频播 ...