生成word文件痕迹列表,定位光标到痕迹所在页



就目前公司开发过的几个项目中,都涉及到了文档的在线编辑处理,这个功能好实现,目前网上可以搜出不少在线编辑office的文件的控件和中间件,不管免费的还是收费的产品,公司也试用了不少,后来发现soaoffice挺不错,可惜这个产品是要钱的,但是节省了公司自己的开发成本,所以就一直在使用了。这个演示实现的生成文件痕迹列表和定位光标到痕迹所在页的功能就是用soaoffice实现的,这里先声明一下,免得看到最后再说需要使用soaoffice,你再拿板砖拍我,说我欺骗你浪费你的时间,那样就不划算了。

生成痕迹列表的思路:在文件加载的时候生成。在文件加载的时候,使用soaoffice提供的VBA接口遍历所有word痕迹,获取痕迹的时间和用户生成痕迹列表(还可以获取更多的信息只要你愿意,当然还得word支持才行),给每个痕迹信息都使用下面的超链接包起来,也就是每个痕迹都生成一个超链接,'goToRevision函数的参数i用来传递痕迹的序号。用户点击痕迹信息的时候,执行goToRevision定位光标到痕迹所在页。

<a href='#' onclick='goToRevision("+ i +");'>痕迹的信息 </a>
生成痕迹列表的js方法:
function loading(){
var docObj = document.getElementById("SOAOfficeCtrl").Document;
var rvsCount = docObj.Revisions.Count;
var rvsList = "";

rCount = rvsCount;

for(var i=1;i<=rvsCount;i++)
{
var rvsObj = docObj.Revisions.Item(i);
var dt = new Date(rvsObj.Date);

rvsList = rvsList + "<a href='#' onclick='goToRevision("+ i +");'>" + rvsObj.Author +":"+ dt.toLocaleString() +"</a><br>";
}

document.getElementById("rvl").innerHTML=rvsList;
}

定位痕迹的思路不用说了就是调用office的接口,定位光标到痕迹所在页,方法就是goToRevision方法,关键就是两句代码:
docObj = document.getElementById("SOAOfficeCtrl").Document; //获取office接口
docObj.Revisions.Item(index).Range.Select(); // 定位光标到痕迹所在页
演示中的代码:
function goToRevision(index)
{
refreshList();
var docObj = document.getElementById("SOAOfficeCtrl").Document;
try{
docObj.Revisions.Item(index).Range.Select();
}
catch(e){
loadList();
}

}
在演示的代码中还有两个函数refreshList和loadList的用处是什么呢?先说refreshList的作用。如果打开文件的模式是清稿模式(soaoffice里叫核稿模式,就是接受和拒绝修订功能的那个模式)用户如果接受或拒绝一个修订以后文件的痕迹就会少一个,如果用户操作的不是文件的最后一个痕迹,那么这个痕迹之后的痕迹的序号值都会减1,比方说一共有5个痕迹,用户接受了第3个痕迹,那么第3个痕迹不存在了,第4个痕迹的序号就变成了3,成了第3个痕迹,第5个痕迹的序号变成4,依次类推……,所以需要重新生成一下列表。
loadList的主要功能就是在更新列表之前,加载一个gif更新动画,提示一下用户列表在更新,不然用户一点击痕迹列表,痕迹少了一条会感觉很奇怪。
loadList的代码:
document.getElementById("rvl").innerHTML= "<br><img src='load.gif'><br><br>"; // 显示一下“加载效果”的gif图片,提示用户在更新痕迹列表。
setTimeout(loading,500); // 真正的开始更新痕迹列表。

下载完整的demo:http://ishare.iask.sina.com.cn/f/10865554.html

Simple.jsp详细代码:
******************
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,java.awt.*,java.util.*" errorPage="" %>
<%request.setCharacterEncoding("gb2312");%>
<%@page pageEncoding="GB2312"%>
<%
SOAOfficeX.SOAOfficeCtrl  SOACtrl = new  SOAOfficeX.SOAOfficeCtrl(pageContext);
// 设置SOAOFFICE中间件服务页面
SOACtrl.ServerURL = "/soaservlet/soaserv.do";

SOACtrl.MenubarStyle = 5;

SOACtrl.SaveDocURL = "SaveDoc.jsp";
SOACtrl.webOpen("doc/test.doc", 1, "somebody", "Word.Document");
%>


<HTML>
<HEAD>
<TITLE>痕迹处理 -- soaoffice</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>
body{

text-align:center;
min-width:800px;
color:#FFFFFF;
margin:0px;
padding:0px;
}


#header {
WIDTH: 1000px; HEIGHT: 50px; color:red;
}
#wrapper {
MARGIN-TOP: 10px; WIDTH: 1000px
}
#navigation {
MIN-HEIGHT: 700px; FLOAT: left; WIDTH: 200px; HEIGHT: 700px; border:1px solid red; color:#333;

}
#content {
MARGIN-TOP: 10px; MIN-HEIGHT: 700px; MARGIN-LEFT: 210px; WIDTH: 740px; HEIGHT: 700px; BACKGROUND-COLOR: #333333
}
#footer {
MARGIN-TOP: 10px; WIDTH: 1000px; HEIGHT: 100px;
}
.hTitle {
font-size:14px;line-height:25px;BACKGROUND-COLOR: #FFFF8F;border-bottom:1px solid red;
}
.henji {
font-size:12px;border-bottom:1px solid green;line-height:25px;
}
</STYLE>

<META content="MSHTML 6.00.3790.4772" name=GENERATOR>


</HEAD>
<body>
<SCRIPT language="JavaScript">
var rCount = 0; //保存文件中痕迹的个数
function refreshList()
{
var docObj = document.getElementById("SOAOfficeCtrl").Document;
var rvsCount = docObj.Revisions.Count;
if (rvsCount != rCount) {
loadList();
}
}
function goToRevision(index)
{
refreshList();
var docObj = document.getElementById("SOAOfficeCtrl").Document;
try{
docObj.Revisions.Item(index).Range.Select();
}
catch(e){
loadList();
}

}
function loadList()
{
document.getElementById("rvl").innerHTML= "<br><img src='load.gif'><br><br>";
setTimeout(loading,500);

}
function loading(){
var docObj = document.getElementById("SOAOfficeCtrl").Document;
var rvsCount = docObj.Revisions.Count;
var rvsList = "";

rCount = rvsCount;

for(var i=1;i<=rvsCount;i++)
{
var rvsObj = docObj.Revisions.Item(i);
var dt = new Date(rvsObj.Date);

rvsList = rvsList + "<a href='#' onclick='goToRevision("+ i +");'>" + rvsObj.Author +":"+ dt.toLocaleString() +"</a><br>";
}

document.getElementById("rvl").innerHTML=rvsList;
}

</SCRIPT>

<DIV id=header>点击“痕迹列表”中的痕迹,定位光标到痕迹所在页。</DIV>
<DIV id=wrapper>
<DIV id=navigation>
<div class="hTitle">痕迹列表:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="#" onclick="loadList();">刷新</a>
</div>
<div id="rvl" class="henji" >
</div>
</DIV>
<DIV id=content>
<!--**************   SOAOFFICE 客户端代码开始    ************************-->
<SCRIPT language="JavaScript" event="OnInit()" for="SOAOfficeCtrl">
// 控件打开文档前触发,用来初始化界面样式
</SCRIPT>
<SCRIPT language="JavaScript" event="OnDocumentOpened(str, obj)" for="SOAOfficeCtrl">
// 控件打开文档后立即触发,添加自定义菜单,自定义工具栏,禁止打印,禁止另存,禁止保存等等
loadList();
</SCRIPT>
<SCRIPT language="JavaScript" event="OnDocumentClosed()" for="SOAOfficeCtrl">

</SCRIPT>
<SCRIPT language="JavaScript" event="OnUserMenuClick(index, caption)" for="SOAOfficeCtrl">
// 添加您的自定义菜单项事件响应
</SCRIPT>
<SCRIPT language="JavaScript" event="OnCustomToolBarClick(index, caption)" for="SOAOfficeCtrl">
// 添加您的自定义工具栏按钮事件响应
</SCRIPT>
<!--   OBJECT标签,客户端控件引用    -->
<OBJECT id="SOAOfficeCtrl" codeBase="SOAOffice.ocx#version=8,1,0,0" height="100%" width="100%" classid="clsid:83171BA4-BDCA-42a8-BE44-745ABF36EB7E" data="" VIEWASTEXT>
<div align=center STYLE="color:red;">本机尚未安装SOAOFFICE客户端控件,请安装浏览器上方黄色提示条或弹出提示框中的SOAOFFICE客户端控件。</div>
</OBJECT>
<!--**************   SOAOFFICE 客户端代码结束    ************************-->
</DIV>
</DIV>
<DIV id=footer></DIV>
</body>
</HTML>






你可能感兴趣的:(sql,jsp,中间件,Office,VBA)