精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● PHP>>实用技巧>>[转载][精彩中文版]PHP4中的COM函数-Wind

主题:[转载][精彩中文版]PHP4中的COM函数-Wind
发信人: 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]

[关闭][返回]