OA项目中遇到这样一个问题:用户起草一种类型的公文,编辑word正文时希望能够将公文中的一些内容自动带到正文中,这个无非就是从服务器上把公文所对应的word正文文件下载到本地,替换掉里面指定内容的事,问题的关键在于替换掉内容后,或者用户填写了内容后,关闭word文件,如何监听此事件以在word程序退出后将此文件上传到服务器,不然,用户岂不是只是在本地做了修改,毫无用处。google了很久,终于解决了此问题,过程如下:
<html>
<body οnlοad="download(34567);init("C://Temp/" + 34567 + ".doc");replacefile();wordlistener();">
</body>
</html>
<script language="javascript">
//根据公文ID下载文件
function download(objID){
doDownload(objID);
}
function upload(filepath){
doUpload(filepath);
}
</script>
<script language="vbscript">
'定义变量 开始
'定义操作word文件的相关变量
Dim myDocApp
Dim myDoc
Dim objSelection
Dim wordfilepath
'定义变量 结束
'初始化 开始
'设置操作word文件的相关变量
function init(filepath)
Set myDocApp = CreateObject("Word.Application")
myDocApp.Visible = True
myDocApp.Activate
myDocApp.Application.ScreenUpdating = False
set myDoc = myDocApp.Documents.Open(filepath)
Set objSelection = myDocApp.Selection
Set wordfilepath = filepath
end function
'初始化 结束
'替换文件使用VBS 开始
'对下载到本地的公文模板进行内容替换
function replacefile()
replace "#departname#","办公室"
replace "#username#","张三"
replace "#createDate#","2009-12-17"
end function
'替换文件使用VBS 结束
'替换函数 开始
function replace(text,replacetext)
With objSelection.Find
.Text = text
.Replacement.Text = replacetext
.Forward = True
.Wrap = 1
.Execute ,,,,,,,,,,2
End With
end function
'替换函数 结束
'监听系统进程的函数 开始
function wordlistener()
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objEventSource = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process'")
Do While True
Set objEventObject = objEventSource.NextEvent()
If Ucase(Left(objEventObject.TargetInstance.Name, 7)) = "WINWORD" Then
Select Case objEventObject.Path_.Class
'如果是打开
'Case "__InstanceCreationEvent"
'在这里添加事件处理代码
'如果是关闭
Case "__InstanceDeletionEvent"
'在这里添加事件处理代码 上传文件
upload wordfilepath
Exit Do
End Select
End If
Loop
end function
'监听系统进程的函数 结束
</script>