日期:2014-05-16  浏览次数:20401 次

用js程序给word中的书签完美赋值(赋值以后书签还存在)


用程序控制word文件中数据的值算是个高级功能,以前以为在网页中编辑服务器上的word文件是没办法实现的,领导给安排任务的时候才知道原来有不少产品可以实现文件在线编辑功能,有office中间件,还有文档控件。后来根据客户需求,还需要用程序控制word文档中的内容,太匪夷所思了,不过后来发现也是可以的,有一个soaoffice的产品就可以使用后台编程控制文档中的数据,但还是不能解决我们的需求,还好soaoffice提供了VBA的调用接口,这样就可以我们自己开发控制了,就是学习VBA稍微麻烦点。下面说一下我们的需求:
同步表单上的数据和word文档中的数据。要求用户在操作html表单的时候,打开的word文档中对应的数据也需要跟着修改,防止生成的word文件和数据库中保存的数据不统一。
对于以上需求的分析:让用户手动修改同步数据很不现实,用户很容易忘记两个地方都需要修改的,如果程序那么不智能要咱们开发人员干吗?soaoffice示例代码中自带了一个演示,是可以修改编辑框中的值,看到word文件中的标题也跟着改变了,但是同样存在问题,如果用户直接修改文档中的值了那怎么办,所以需要禁止用户编辑,还要能控制文档中的数据。这就需要把文件保护起来,修改数据的时候解保护,修改以后重新保护起来。
使用下面的三个js函数就可以实现,Protect、Unprotect、SetValueToBookMark:
Protect 保护文档,设置文档只读不能编辑:
function Protect() {
        document.getElementById("SOAOfficeCtrl").Document.Protect(3, false, "psssword");

}
Unprotect取消文档保护,设置文档可以编辑:
    function Unprotect() {
        document.getElementById("SOAOfficeCtrl").Document.Unprotect("psssword");

}
SetValueToBookMark 给书签赋值。给word中的书签完美赋值,就是实现赋值以后书签还存在的这个效果的关键代码就是此函数了,有兴趣的话可以分析一下这个函数在给书签赋值的时候把书签的Range先交给一个变量保存起来:
    function SetValueToBookMark(txtValue, BookMarkName) {
        try {
            var bkmkObj = document.getElementById("SOAOfficeCtrl").Document.BookMarks(BookMarkName);
            if (!bkmkObj) {
                alert("Word 模板中不存在名称为:\"" + BookMarkName + "\"的书签!");
            }
            var saverange = bkmkObj.Range;
            saverange.Text = txtValue;
            document.getElementById("SOAOfficeCtrl").Document.Bookmarks.Add(BookMarkName, saverange);
        }
        catch (err) {

        }
}

在页面中的代码:
性别:
    <select onchange="selectChange(this.value);">
        <option value="男">男</option>
        <option value="女">女</option>
    </select>
当 select改变的时候执行selectChange,selectChange的逻辑就是先解除文档的保护,然后给书签赋值,再把文档重新保护起来,完成一次赋值的操作。

    function selectChange(value) {
        Unprotect();
        SetValueToBookMark(value, 'sex');
        Protect();
}

注意:一定要在文档打开的时候先把文档保护起来,不然文档打开的时候用户可以编辑就麻烦了。在OnDocumentOpened事件中执行Protect();
<SCRIPT language="JavaScript" event="OnDocumentOpened(str, obj)" for="SOAOfficeCtrl">
// 控件打开文档后立即触发
Protect();
</SCRIPT>

完整代码:http://ishare.iask.sina.com.cn/f/10726427.html
不管用的是什么产品,这次说的这个用js给书签赋值的功能,只要是那个产品可以支持js调用office的VBA接口就可以用这个方法了,上面的代码以soaoffice为例,如果用的不是soaoffice那就改改代码应该也可以实现。
公司是用c#开发的,这个代码是直接改出来的,要是用java开发的话,主要也是上面的三个函数,自己改改不难,呵呵。