PHP4中COM函数探讨

PHP4中COM函数探讨

介绍

内置于PHP4里的COM函数对于我们在win32环境下开发程序是相当有吸引力的,但是至今仍没有多少相关的技术文档。本文将以三个例子分别处理MSoffice2000Word、Excel、AdobeDistiller来说明如何在PHP中使用COM函数。

COM技术是由Microsoft在几年前提出并开发的,本文中提到的相关名词有OLE,OLEAutomation,ActiveX,COM,这些词的意思都基本一样,都表示用一段封装的代码(对象)来完成一个windows应用程序的一些功能。PHP4COM函数可以连接一个对象实例,并使用它的方法与属性。

如果你想使用下面的例子源码,请参考一下我的配置。

Windows98-MSOffice2000

Apache1.3.9Windows

PHP4.02Dev(08-20-00)RunningasCGI

PHP4中的COM标记

现在让我们开始吧,用PHP4的COM来实例化一个组件,需要new操作符和对象的"OLE程序标识":

$instance=newCOM("$identifier");

?>

因为COM是一个PHP4的保留字,它传送这个对象的标识给一个构造函数,现在得到了这个组件的一个实例,根据OOP类的性质,我们可以很容易地访问它的方法与属性。

例如:

$instance->[Object]->[method1]->[method2]->..->[property];

?>

就是这么简单!

OOP的结构在PHP下不能工作,(由于PHP语法的问题,属性的名字.值是非法字符,如点和圆括号等),所以PHP4提供了两个相应的函数:

boolcom_set(classcom_object,stringpropertyname,stringproperty_value);

mixedcom_get(classcom_object,stringproperty_name);

?>

最后,PHP4也支持DCOM技术,可以在远程计算机创建一个对象实例。

$Instance=newCOM(string"Componentname",string"remote_server_address");

?>

注意:这是用DCOM指令来设置PHP。在将来,PHP开发者提供Unix下对DCOM的支持。

标识、方法和属性

标识是一个如下的字串:

MSWord:"Word.Application"or"Word.Application.9"

MSExcel:"Excel.Application"or"Excel.Sheet"

ADOBEAcrobat:"Exch.application"or"PdfDistiller.PdfDistiller"

对于最后一个标识,我要指明的是,获得正确的对象标识名不是一件容易的事。如果你不能访问VBA文档,你可以查找一下windows的注册表,在HKEY_CLASSES_ROOT中寻找一下,你就可以得到一些应用程序的名字。在你的机器上有效的对象标识放在CLSID子文件夹下。

应用程序一般会提供文档说明它的COM方法和属性。在office2000中,你可以运行程序,打开VBA编辑器,选择对象编辑器。输入应用程序库中的一个方法名或属性名,然后,在下面的窗口中用鼠标右键选择一个类或成员名称,点帮助,你就会得到关于这个类或成员的描述。你也可以参考MSDN。一个Excel的例子如下:http://msdn.microsoft.com/library/officedev/off2000/xltocobjectmodelapplication.htm

用COM函数操作MSWord

现在,我们开始第一个例子吧:

#*********************************************************

#本例来自Zend站点,略有改动

#打开一个word实例,并新建一个文档Uselesstest.doc

#输入一行文字"Thisisatest2..."

#*********************************************************

#实例化一个对象

$word=newCOM("word.application")ordie("UnabletoinstantiateWord");

#取得并显示版本

print"LoadedWord,version{$word->Version}

";

#另一种方法去取得版本

$testversion=com_get($word->application,version);

print"VersionusingCom_get():$testversion

";

#使其可见

$word->Visible=1;

#创建新文件

$word->Documents->Add();

#写字符

$word->Selection->TypeText("Thisisatest...");

#保存

$word->Documents[1]->SaveAs("Uselesstest.doc");

#关闭

$word->Quit();

?>

你只要花几分钟来读这个程序,并参考Word的OLE技术文档,你将学到几乎是你在自己程序中所需的全部的操作。

MSExcel在使用PHP的COM函数

如同上面的Word的例子一样,你应学习这个例子的同时参考Excel的VisualBasic编辑器中的对象浏览器的帮助文档。

#打开workbook和它的sheet,

#本例使用一个电子表格是Excel安装时自带的SOLVSAMP.XLS

$workbook="C:ProgramFilesMicrosoftofficeOfficeSamplesSOLVSAMP.XLS";

$sheet="QuickTour";

#实例化一个组件的对象

$ex=newCOM("Excel.sheet")orDie("Didnotconnect");

#取程序名称和版本

print"Applicationname:{$ex->Application->value}

";

print"Loadedversion:{$ex->Application->version}

";

#打开工作本使我们可使用它

$wkb=$ex->application->Workbooks->Open($workbook)orDie("Didnotopen");

#预保存原来的工作本,创建一个工作本的复本

$ex->Application->ActiveWorkbook->SaveAs("Ourtest");

#$ex->Application->Visible=1;#本句去注释让Excel可见

#读写一个单元格在一个新的工作表中

#我们可以读到这个单元格E11(Advertisinginthe4th.Quarter)

$sheets=$wkb->Worksheets($sheet);#Selectthesheet

$sheets->activate;#Activateit

$cell=$sheets->Cells(11,5);#Selectthecell(RowColumnnumber)

$cell->activate;#Activatethecell

print"OldValue={$cell->value}

";#Printthevalueofthecell:10000

$cell->value=15000;#Changeitto15000

print"Newvalue={$cell->value}

";#Printthenewvalue=15000

#最后,用新值重新计算这个单元格

$sheets->Calculate;

#必须的如果要计算,手动则是可选的

#可看到效果总价值(E13单元格)

$cell=$sheets->Cells(13,5);#Selectthecell(RowColumnnumber)

$number=Number_format($cell->value);

print"NewTotalcost=$$number-was$47,732before.

";

#根据计算公式,广告影响了公司的开销,这里将显示$57,809

#使用Excel内建的函数

#PMT(percent/12months,Numberofpayments,Loanamount)

$pay=$ex->application->pmt(0.08/12,10,10000);

$pay=sprintf("%.2f",$pay);

print"Monthlypaymentfor$10,000loan@8%interest/10months:$$pay

";

#Shouldprintmonthlypayment=$-1,037.03

#可选,保存

$ex->Application->ActiveWorkbook->SaveAs("Ourtest");

#关闭,不提问

$ex->application->ActiveWorkbook->Close("False");

unset($ex);

?>

这个例子让你的PHP与Excel一同工作了,当然,也有更多的对象可以使用,访问一个自已写的OOP封装类也与访问excel一样容易。

用PHP的COM访问AdobeDistiller

这最后一个例子不是MS程序了,如果你的程序有一个PostScript文件,你会对这个有兴趣的,改写(蒸馏)它成为一个PDF文档.Adobe有一个程序叫Distiller,它可以生成一个实例。代码如下:

$pdf=newCOM("pdfdistiller.pdfdistiller.1");

?>

有一点要注意的,是在Distiller的文档中给出的这个OLE标识名"pdfdistiller"是无效的。

蒸馏一个文件的最基本的方法是:

$pdf->FileToPdf($psfile,strOutputPDF