msgbartop
PHP源码分析,Zend引擎分析,Web相关技术研究,Web技术分享–左手代码 右手诗
msgbarbottom

18 May 09 使用JS做文档处理

最近应友人邀请, 要帮忙写个文档处理脚本, 考虑到如果使用PHP或者Perl需要在友人的机器上,搭建一个运行环境,比较复杂, 使用起来也不友好, 本着以人为本的信念, 决定采用hta实现.

其实, 在Windows平台上, js可以调用很多Windows提供的ActivexObject, 在这个意义上来说, 用js写HTA时, js已经不再是传统意义上的Web客户端脚本了, 它已经有些类似于VB了.

本文就使用js来实现文档处理, 和使用js编写ActiveX做一个简单介绍.

言归正传, 友人的需求是: 把一个文件夹下的所有文件内容都读出来, 并且每个文件做为一个Excel的Sheet, 写入一个固定Excel中.

    难点 :
    1. 读取文件
              我们知道, js本身并没有读写文件的API。
          2. 写入Excel
              写入Excel,并且有多个Sheet是个难点。
    解决方案:
          1. 采用FileSystemObject ActiveX Object 来实现文件读取,文件夹遍历
          2. 采用Excel Application ActiveX Object 来实现写Excel

采用FSO遍历文件夹:

                var path = 'C:\\folder\\';
		var fso  = new ActiveXObject("Scripting.FileSystemObject"); //创建一个FSO实例
		var dir = fso.GetFolder(path);
		var fc = new Enumerator(dir.files); //构建可枚举实例
                var file = {};
		for(; !fc.atEnd(); fc.moveNext()) {
			file = fc.item(); //包含文件名
		        alert(file);
		}

写Excel:

		// var files  包含了所有要文件路径的数组, 由上面的逻辑提供
		var fso  = new ActiveXObject("Scripting.FileSystemObject");
		try {
			var excelApp  = new ActiveXObject("Excel.Application");
		} catch (e) {
			alert("请确保您安装了 MS-EXCEL ");
			return;
		}
		var excelBook = excelApp.Workbooks.Add();
		var excelSheet;
		var current = 1;
		for ( var file  in files ) {
			excelBook.Worksheets.Add();
			excelSheet = excelBook.WorkSheets(current++);
			excelSheet.name = file; //命名sheet
			//开始读取文件
			var fh = fso.OpenTextFile(file, 1/*reading*/);
			var content = '';
			while ( !fh.AtEndOfStream ) {
				  content += fh.ReadLine();
			}
			fh.close()

			excelSheet.Cells(1, 1).Value = content + '\t'; //写入
		}
		excelApp.ActiveWorkbook.SaveAs("C:\\TEST.XLS"); //保存Excel文件
		excelSheet.Application.Quit();
  

用js来实现, 觉得最爽的就是调用ActiveX Obj, 完全不用我考虑太多~~ , 爽~

附录, 转载一个有趣的文章:
WSC脚本部件技术:利用Javascript编写ActiveX控件

一个简单的例子:
将如下代码另存为.wsc文件,并右键“注册”(卸载时右键“不注册”)。

<Component>
<registration ProgId=hello.world />
<public>
        <property name=testStr />
        <method name=add>
                <parameter name=x />
                <parameter name=y />
        </method>
</public>
<script>
var testStr="默认值";
function add(x, y)
{
        return x+" + "+y+" = "+(x+y);
}
</script>
</Component>

然后可以通过new ActiveXObject(“hello.world”)的方法来调用该控件。
例如:(另存为.js后双击运行。)

var com=new ActiveXObject("hello.world");
WSH.Echo(com.testStr);
WSH.Echo(com.add(84,25));

这样就可以将javascript代码嵌入到其他编程语言中。

另外,不注册也可以调用该控件,例如:(另存为.js后双击运行。)

var com=GetObject("script:http://www.zope.org/Members/Rimifon/ZopeTest/Sample.wsc");
WSH.Echo(com.testStr);
WSH.Echo(com.add(84,25));

注意的是,JS的GetObject方法因为安全限制,在IE下可能是不能运行的。

另外 还可以使用
regsvr32 http://www.zope.org/Members/Rimifon/ZopeTest/Sample.wsc
指令对远程脚本部件进行本地注册,也可以使用:
regsvr32 http://www.zope.org/Members/Rimifon/ZopeTest/Sample.wsc /u
进行卸载

Related Posts:

Tags: , , ,

Reader's Comments

  1. |

    没被当木马干掉?
    哈哈
    还是perl才是王道

  2. |

    perl是王道,,,只是windows下,友人还是女孩,要考虑实际情况么….

  3. |

    学习了. 感觉与vbs没多大区别

  4. |

    It’s a little jealous about your js ability…^_^

  5. |

    这样挺好的,很喜欢

  6. |

    看不是很懂啊,新手,以后会长来学习

Leave a Comment

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word