论坛首页 AJAX版 JavaScript

实战js提取word模板数据

浏览 1389 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-03-29 关键字: javascript word activex

由于实际需要,提供了一些文档模板,例如是一些申请书,评论表。要求根据不同的模板提取里边的数据。经过简化分析,觉得基本都可以用字符串之类的内容来表示(就算是选择框也一样)。本人的javascript一般,word的相关对象也不甚了解,好在有文档可以参考一下。总算弄出点所以然,跟大家交流交流。 

 

为了看起来比较OO,写js对象的时候,我选择了Dean Edwards写的Base.js,感觉还满方便的。

当时找了很多关于word操作的方法,无奈word的操作比excel繁杂得多,不过最后还是找到用书签来做模板的方法,还挺得意的 。在添加书签的时候,就是要注意把自然段符号给设置好,这样才会比较方便,而且也可以取得多段的内容。还有一个优点是,程序操作相当方便。下面请看:

//关于Base类请参考Base.js
/**
 * @classDescription 字段类,每个对象代表一个字段的相关信息
 * @param {String} name 字段名,对应着书签名
 * @param {String} desc 该字段的中文描述,便于给出出错信息
 * @param {Boolean} is_required 是否为必需的字段,true(必需),false(可选)
 * @property {String} value 该字段的值
 */
var WordAttribute = Base.extend({
    //构造函数
    constructor: function(name, desc, is_required){
        this.name = name;
        this.desc = desc;
        this.is_required = is_required;
        this.value = "";
    }
});

/**
 * @classDescription Word的解析模型类,根据WordAttribute类来解析信息
 * @param {String} modelName 标识名
 * @param {Array} attributes 字段集合,包含零个或多个WordAttribute对象
 * @property {Array} error_message 解析过程中的出错信息
 */
var WordModel = Base.extend({
    //构造函数
    constructor: function(modelName, attributes){
        this.modelName = modelName;
        this.attributes = attributes;
        this.error_message = [];
    },
    //解析函数,activeDoc表示当前活动文档
    parse: function(activeDoc){
        var bookmarks = activeDoc.Bookmarks;
        for (var i = 0; i < this.attributes.length; i++) {
            this.attributes[i].value = "";
            if (this.attributes[i].constructor == WordAttribute) {
		//是否存在该书签
                if (bookmarks.Exists(this.attributes[i].name)) {
                    var value = bookmarks(this.attributes[i].name).Range.Text.Trim();
                    if (value.length != 0) 
                        this.attributes[i].value = value;
		    //是否为必需的字段
                    else if (this.attributes[i].is_required) 
                            this.error_message.push(this.attributes[i].desc + "不能为空!");
                }
                else this.error_message.push("找不到书签" + this.attributes[i].name);
            }
            else this.error_message.push("未知参数错误!");
        }
        return this.error_message.length > 0 ? false : true;
    }
});

 

由于有了封装之后操作就很方便了。从word里边提取相应的书签内容放到js对象里边去。具体操作,请看简单实例:

//提取bookmark
//filename为doc文档,wordArray是一个关于WordAttribute,可以用
//服务器方的数据来填充,动态生成。
function parseBookMarks(filename, wordArray){
    var WordApp;
    var Doc;
    var str = "";
    try {
        WordApp = new ActiveXObject("Word.Application");
        WordApp.Application.Visible = false;
        Doc = WordApp.Documents.Open(filename, true);
        Doc.Activate();
        var activeDoc = WordApp.ActiveDocument;
        var model = new WordModel("testModel", wordArray);
        if (model.parse(activeDoc)) {
           alert("解析成功!");
           return true;
        }
        else {
            //从model.error_message里边获取出错信息
         }
         return false;
    } 
    catch (e) {
        alert(e.description);
    }
    finally {
        WordApp.DisplayAlerts = false;
        Doc.Close();
        WordApp.DisplayAlerts = true;
        WordApp.Quit();
    }
    return false;
}

比较详细的实例请参考附件,写了个简单的试验程序,用ror来实验,所以只是抽取了几个文件。如果出现错误,请先检查一下自己的浏览器设置:在安全级别那里,对没有标记为安全的activex控件那里要做点设置才行。

代码有点仓促,或许有些小问题,不过不影响主题。如果大家有更好的办法,或者其他,也欢迎交流交流。

 

  • word.zip (4.7 KB)
  • 描述: 部分源码
  • 下载次数: 152
   
最后更新时间:2008-03-29
再说一点,js的框架我基本没用过,js代码也写得少。
不过感觉那个Base.js用得相当舒服,不过就是看得不大懂
哈哈。。不知有哪个高人给个极其详细的分析?
   
0 请登录后投票
最后更新时间:2008-04-06
运行错误了。不知道做的什么
   
0 请登录后投票
最后更新时间:2008-04-07
ftmouse 写道
运行错误了。不知道做的什么

估计是要比较高的权限才能运行。。。
   
0 请登录后投票
最后更新时间:2008-04-07
ayeah 写道
ftmouse 写道
运行错误了。不知道做的什么

估计是要比较高的权限才能运行。。。

至少要保证可以建立activex控件
   
0 请登录后投票
最后更新时间:2008-04-15
完全不明白...运行不起来都
   
0 请登录后投票
最后更新时间:2008-04-15
这个。。是不是只能针对IE的?
   
0 请登录后投票
最后更新时间:2008-04-18
需要activex,当然就只针对ie了
   
0 请登录后投票
最后更新时间:2008-06-16
关于继承,以前在John Resig的blog上看到过一篇有趣的:Simple JavaScript Inheritance
连回复一起读一些或许能有些什么收获
   
0 请登录后投票
论坛首页 AJAX版 JavaScript

跳转论坛:
JavaEye推荐