浏览 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控件那里要做点设置才行。 代码有点仓促,或许有些小问题,不过不影响主题。如果大家有更好的办法,或者其他,也欢迎交流交流。
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-03-29
再说一点,js的框架我基本没用过,js代码也写得少。
不过感觉那个Base.js用得相当舒服,不过就是看得不大懂 哈哈。。不知有哪个高人给个极其详细的分析? |
|
| 返回顶楼 | |
|
最后更新时间:2008-04-06
运行错误了。不知道做的什么
|
|
| 返回顶楼 | |
|
最后更新时间:2008-04-07
ftmouse 写道 运行错误了。不知道做的什么 估计是要比较高的权限才能运行。。。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-04-07
ayeah 写道 ftmouse 写道 运行错误了。不知道做的什么 估计是要比较高的权限才能运行。。。 至少要保证可以建立activex控件 |
|
| 返回顶楼 | |
|
最后更新时间:2008-04-15
完全不明白...运行不起来都
|
|
| 返回顶楼 | |
|
最后更新时间:2008-04-15
这个。。是不是只能针对IE的?
|
|
| 返回顶楼 | |
|
最后更新时间:2008-04-18
需要activex,当然就只针对ie了
|
|
| 返回顶楼 | |
|
最后更新时间:2008-06-16
关于继承,以前在John Resig的blog上看到过一篇有趣的:Simple JavaScript Inheritance
连回复一起读一些或许能有些什么收获 |
|
| 返回顶楼 | |





