1.
介绍 
  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_value); mixed com_get(class com_object, string property_name); ?>   最后,PHP4也支持DCOM,可以在远程计算机上创建对象的实例: <?php $Instance = new COM(string "Component name", string "remote_server_address"); ?>   注意:在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/off2000/xltocobjectmodelapplication.htm 

解决方案 »

  1.   

    2.
    使用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 FilesMicrosoft officeOfficeSamplesSOLVSAMP.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 open"); #创建一个工作薄的拷贝,以便初始的工作薄能被保护起来 
    $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 months: $ $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程序:如果你的程序已经生成了一个PostScript文档,将其转换(提 
    取它)成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结合在一起,针对这种混乱,提供了一个开放的源代码解决方案。