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