发信人: jackyz()
整理人: dalasthunder(2002-07-25 06:34:26), 站内信件
|
[转载][精彩中文版]PHP4中的COM函数-Windows版
作者:Alain M. Samoun
翻译:limodou
介绍
PHP4中内建的COM功能对于我们这些工作在win32环境下的人来说很有吸经力 。迄今为止,还没有关于这个专题的更多的文档。这篇短文将解释如何在实际的 PHP4编程中使用COM,我将向你展示三个例子,使用MS office 2000 Word,使用 Excel,和使用Adobe Distiller。微软已经研究COM技术好几年了,而且有着不同 的名字。至于这篇文章所涉及到的术语,OLE,OLE 自动化,ActiveX和COM其实都 是一个东西:它们指的是代码的一块封装(对象),可以向windows应用程序提供 功能。PHP4 COM可以同对象(对象的实例)连接,使用这个对象的方法和属性。
如果你想重新生成下面的例子,下面是我的配置:
Windows 98 - MS Office 2000
Apache 1.3.9 Windows
PHP4.02 Dev (08-20-00) 以CGI方式运行
PHP4中的COM标记
让我们首先了解一下在PHP4中使用COM函数的细节信息。要实例化一个组件, 需要"new"操作符和对象的"OLE 标识符":
<?php
$instance = new COM("$identifier");
?>
COM在PHP4是一个保留的类名,它会传递对象的标识符给构造函数。现在,我 们已经实例化了组件,就可以通过使用OOP类,容易地使用组件的方法和属性。例 如:
<?php
$instance->[Object]->[method1]->[method2]->..->[property];
?>
简单吧!
当OOP的构造函数无法执行时,有两个函数可以用于PHP4 COM。(用在出现了 PHP语法问题的时候,可能是由于属性的名字和值包含了非法字符,如'.'或')') 。
<?php
bool com_set(class com_object, string property name, string property_v alue);
mixed com_get(class com_object, string property_name);
?>
最后,PHP4也支持DCOM,可以在远程计算机上创建对象的实例:
<?php
$Instance = new COM(string "Component name", string "remote_server_add ress");
?>
注意:在PHP配置中要设置一下DCOM指示。PHP的开发者可能会在将来增加对 于Unix的DCOM支持。就这么多了,没有再多的函数要记住的了!
标识符,方法和属性
标识符是个字符串,就象:
For MS Word: "Word.Application" 或 "Word.Application.9"
MS Excel: "Excel.Application" 或 "Excel.Sheet"
ADOBE Acrobat: "Exch.application" 或 "PdfDistiller.PdfDistiller"
正如最后的标识名所显示的,不总是很容易地知道对象的正确的名字。如果 你还没有处理过VBA文档,可以查看windows注册表(开始菜单 - 运行 regedit), 在HKEY_CLASSES_ROOT文件夹下查看:向下扫描,直到扩展名列表的后面,然后将 看到应用程序名字。在你的机器上可能的COM标识符是有着CLSID子文件夹的文件 夹名称。
应用程序应该将它的COM方法和属性说明做成文档。在Office 2000中,启动 应用程序,打开Visual Basic编辑器(可以使用<ALT+F11>快捷键),选择对象编辑 器(<F2>)。输入名字或属性找到应用程序库。接着在下面挨着的窗口中选中类或 成员,在成员名上右击鼠标。选择帮助,就会得到类或成员的描述。也可以参考 MSDN。如对于Excel是:http://msdn.microsoft.com/library/officedev/off20 00/xltocobjectmodelapplication.htm
使用PHP4 COM函数处理MS Word
现在,我们所要做的就是开始第一个例子:
<?php
#*********************************************************
#这个例子是从Zend站点来的,有一点改动。它将打开一个新的Word实
#例,创建一个名为"Useless test.doc"的新文档,加入一行"This
#is a test2..."文本。
#*********************************************************
#实例化Word组件。
$word = new COM("word.application") or die("Unable to instantiate Word ");
#得到它的版本并打印出来
print "Loaded Word, version {$word->Version}<BR>";
#另一种方法,使用com_get得到版本
$testversion = com_get($word->application,version);
print "Version using Com_get(): $testversion <BR>";
#使之在一个窗口中显示
$word->Visible = 1;
#打开一个新文档
$word->Documents->Add();
#输出东西
$word->Selection->TypeText("This is a test...");
#保存文件
$word->Documents[1]->SaveAs("Useless test.doc");
#如果你想看到Word文档,然后手工关闭Word,将下一行注释
$word->Quit();
?>
如果你学习这个例子几分种,并且使用Word所带的OLE文档,你将学到几乎所 有的东西,足够编写你自已的程序。
使用PHP4 COM函数处理MS Excel
如同上面的Word的例子,通过使用Excel里的Visual Basic编辑器下的对象浏 览提供的帮助来研究下面的代码。
<?php
#设置工作薄和它的工作表以便使用。这个例子中,我们
#:使用随着Excel安装所带的一个电子表文件,叫做:SOLVSAMP.XLS:
$workbook = "C:\Program Files\Microsoft office\Office\Samples\SOLVSAMP .XLS";
$sheet = "Quick Tour";
#实例化电子表组件
$ex = new COM("Excel.sheet") or Die ("Did not connect");
#得到应用程序名及版本
print "Application name:{$ex->Application->value}<BR>" ;
print "Loaded version: {$ex->Application->version}<BR>";
#打开我们想使用的工作薄
$wkb = $ex->application->Workbooks->Open($workbook) or Die ("Did not o pen");
#创建一个工作薄的拷贝,以便初始的工作薄能被保护起来
$ex->Application->ActiveWorkbook->SaveAs("Ourtest");
#$ex->Application->Visible = 1; #去掉注释以便使Excel可见
#在一个新的工作表中读写一个单元
#我们想读出E11单元(第四季度的广告)
$sheets = $wkb->Worksheets($sheet) #选择工作表
$sheets->activate; #激活它
$cell = $sheets->Cells(11,5)#选择单元(行,列值)
$cell->activate; #激活单元
print "Old Value = {$cell->value} <BR>"; #打印单元的值:10000
$cell->value = 15000; #将其改为15000
print "New value = {$cell->value}<BR> "; #打印新的值=15000
#最后根据新值重新计算工作表
$sheets->Calculate; #如果calc.选项为手工才需要
#查看对合计成本的影响(单元E13)
$cell = $sheets->Cells(13,5) ; #选择单元(行,列值)
$number = Number_format($cell->value);
print "New Total cost =\$$number - was \$47,732 before.<BR>";
#应该打印$57,809,因为根据单元公式,广告影响了公司的管理费用
#使用Excel内建函数的例子
#函数PMT(百分比/12个月,付款值,贷款总数)
$pay = $ex->application->pmt(0.08/12,10,10000);
$pay = sprintf("%.2f",$pay);
print "Monthly payment for $10,000 loan @8% interest /10 month s: \$ $pay<BR>";
#应该打印每月的支付量 = = $ -1,037.03
#可选的,保存修改过的工作薄
$ex->Application->ActiveWorkbook->SaveAs("Ourtest");
#没有问题,关闭所有的工作薄
$ex->application->ActiveWorkbook->Close("False");
unset ($ex);
?>
这个例子应该让你了解了Excel COM和PHP。当然有更多的对象可以使用。编 写一个封装了主要函数的类,处理excel对象则更容易。
使用PHP COM处理Adobe Distiller
这是最后一个例子,用来处理非MS程序:如果你的程序已经生成了一个Post Script文档,将其转换(提取它)成PDF文档可能会有意思。Adobe有一个程序叫做 Distiller,它的windows版可以被实例化,使用下面的代码:
<?php
$pdf = new COM("pdfdistiller.pdfdistiller.1");
?>
注意OLE标识符名不明显,特别是distiller的文档(Adobe的技术手册#5158) 称之为"pdfdistiller"。
提取一个文档的主要方法是:
<?php
$pdf->FileToPdf ($psfile, strOutputPDF , strJobOptions );
?>
此处$psfile是PostScript文件的名字,strOutputPDF是输出的PDF文件的名 字。StrJobOptions是给Distiller使用的参数文件名。方法的最后两个参数可以 为空,以便使用同一个名字,PS文件用来生成PDF文件,且使用缺省的任务选项文 件。例如:
<?php
$pdf->FileToPdf ($psfile, "", "");
#这里$psfile可以是Myfile.ps,那么输出文件就是Myfile.pdf.
?>
Distiller还有更多的方法和属性可以使用。如果你感兴趣,看一下Adobe的 技术手册。
忠告/可能的问题
如果在程序中存在一些错误,如可能已经实例化了对象,但在它超时之前程 序可能没有关闭。最坏的是,应用程序可能会记住已经进行过实例化了。结果就 是,可能在程序列表中存在几个拷贝,并且会影响你改正问题。解决办法是:在 修改过错误之后,在重新执行之前清除(&lgt;CTRL+ALT+Delete>然后结束任务)程 序列表中所有的实例。基于同样的原因,在代码的最后应该总是关闭程序,并且 删除实例。
在使用com_get和com_set时你可能会觉得古怪。例如:$Version = Com_get ($instance->Application, "Version");在Word中执行正确,但在Excel却输出错 误。
一些对象不能用PHP4进行实例化,错误显示为:这些对象需要一个定制的接 口,但PHP4 COM不支持它。
为什么用它?
我非常希望这三个例子能够给你一些线索。PHP COM允许在一个PHP脚本中同 时与许多Windows程序连接。这样的代码比ASP要简单的多,并且可以同PHP的强大 的数据库函数结合起来。微软在任何地方都经销它的COM技术,并且用不同的名字 和体系结构,象COM+(联合了COM和微软的交易服务器 MTS),ADO,OLE DB,OWC, Windows DNA,等等。现在PHP和Apache结合在一起,针对这种混乱,提供了一个 开放的源代码解决方案。
转自:PHPBuilder.com
转自:PHPRecord.com
注:原文参看本版精华区[COM in PHP(windows)]
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.141.196.118]
|
|