如何关闭所有打开的文本文件?
小弟对多个文本进行操作,最终操作完成后要关闭这些文件,但要再...
作者 dong 发布于 2003-09-02 分类:php基础编程
简介
PHP4内置的COM函数对于在win32环境下编程的人们确实有吸引力。目前关于这方面的文档并不多。这篇文章将用3个例子(MS office 2000, Excel, Adobe Distiller)来解释怎样在PHP4里用COM编程。微软用不同的名称开发COM技术已经有多年了。在这篇文章里OLE, OLE自动化, ActiveX和COM都是一回事:用一段封装的代码来为一个windows应用实现一些函数。PHP4的COM建立与对象的连接(实例化对象)然后用其中的方法和属性。
如果你想重新开发这些例子,以下是我的配置:
Windows 98 - MS Office 2000
Apache 1.3.9 Windows
PHP4.02 Dev (08-20-00) Running as CGI
PHP4里的COM标记
让我们从PHP4里的COM函数开始。要实例化一个控件,需要一个“new”操作符和对象的“OLE标识符”:
<?php $instance = new COM("$identifier"); ?>
COM是PHP4保留的一个类名称,它把$identifier传给构造函数。 我们现在有了一个实例化的控件,可以用OOP技术很方便的引用它的方法和属性。例如:
<?php $instance->[Object]->[method1]->[method2]->..->[property]; ?>
就是这么简单!
如果不能这样引用的话(有时当属性的名称或值中含有点或括号等特殊字符时会引起PHP语法错误),PHP4 COM还提供了两个函数:
<?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可能将来支持在Unix上使用DCOM。
标识符,方法和属性
标识符是类似下面的字符串:
MS Word: "Word.Application" 或 "Word.Application.9"
MS Excel: "Excel.Application" 或 "Excel.Sheet"
ADOBE Acrobat: "Exch.application" 或 "PdfDistiller.PdfDistiller"
就象最后一个标识符表明的,并不是所有的对象的名称都是显而易见的。如果你没有VBA的文档,你可以查看注册表的HKEY_CLASSES_ROOT文件夹:在扩展名列表的下面你可以看到应用程序的名称,有CLSID子文件夹的就是可用的COM标识符。
应用程序应该提供有关COM的方法和属性的文档。例如在Office 2000中,打开程序,用快捷键
http://msdn.microsoft.com/librar ... odelapplication.htm
逛论坛交流:大家来研究一下com吧
本文介绍的函数只能在windows下的PHP中使用。
函数列表:
com_load — 创建一个COM组件的引用。
com_invoke — 调用一个COM组件的方法。
com_propget — 取一个COM组件的属性的值。
com_get — 同上,取一个COM组件的属性的值。
com_propput — 赋一个值给一个COM组件的属性。
com_propset — 同上,赋一个值给一个COM组件的属性。
com_set — 同上,赋一个值给一个COM组件的属性。
在www.php.net 下给出了如下实例:
例1:
<?
$word=new COM("word.application") or die("Cannot start word for you");
print "Loaded word version ($word->Version)n";
$word->visible =1 ;
$word->Documents->Add();
$word->Selection->Typetext("Dit is een test");
$word->Documents[1]->SaveAs("burb ofzo.doc");
$word->Quit();
?>
例2:
另外,有人给出了另一个例子,用 Delphi做了一个对象 MyObject (一个方法 ComTophp)。
也可以这样用:
$Obj = com_load("MyLibraryTest.MyObject");
$result = com_invoke($Obj,"ComTophp","Params 1","Params 2");
echo $result;
上面这个例子我可没试过哦。
例3:
<?
# example use of ADODB and SQLOLEDB (MS-SQL 7) in PHP 4
# Tested on Win2K with PHP 4.02
$conn_obj = new COM("ADODB.Connection") or die("Cannot start ADO");
// replace myserver with your server name
define ("OLEDB_CONNECTION_STRING", "Provider=SQLOLEDB; Data Source=myserver; Initial Catalog=Northwind; User ID=sa; Password=");
// use SQL Server 7.0 OLE DB Provider
$conn_obj->Open(OLEDB_CONNECTION_STRING);
$command = "select lastname, firstname, title from employees"; // SQL Statement
$rs = $conn_obj->Execute($command); // Recordset
$i = 0;
$fld0 = $rs->Fields(0);
$fld1 = $rs->Fields(1);
$fld2 = $rs->Fields(2);
while (!$rs->EOF) {
$i += 1;
print "$fld0->value $fld1->value $fld2->value
";
$rs->MoveNext();
}
$rs->Close();
?>
好了,下面就逐个介绍吧。
//******************
com_load
(PHP3.0.3 - 3.0.16 only)
string com_load (string module name [, string server name])
创建一个COM组件新的引用,并返回它,如果失败,返回 false 。
参数分别是模块名和服务器名。
//********************
com_invoke
(PHP3.0.3 - 3.0.16 only, PHP4 )
mixed com_invoke (resource com_object, string function_name [, mixed function parameters, ...])
调用一个COM组件的方法。如果成功,返回function_name的返回值,否则,返回false。
参数分别是:模块引用,方法名,方法所需的参数,
//*************************
com_propget
(PHP3.0.3 - 3.0.16 only, PHP4 )
mixed com_propget (resource com_object, string property)
取COM组件的一个属性的值,本函数是 com_get() 的一个别名。
//*************************
com_get
(PHP3.0.3 - 3.0.16 only, PHP4 )
mixed com_get (resource com_object, string property)
参数分别是:COM引用,属性名。
如果错误,返回 false。
//***************************
com_propput
(PHP 3.0.3 - 3.0.16 only, PHP4 )
void com_propput (resource com_object, string property, mixed value)
给COM组件的一个属性付值。本函数是 com_set() 的一个别名。
//****************************
com_propset
(PHP3.0.3 - 3.0.16 only, PHP4 )
void com_propset (resource com_object, string property, mixed value)
这也是com_set()的一个别名。
//****************************
com_set
(PHP3.0.3 - 3.0.16 only, PHP4 )
void com_set (resource com_object, string property, mixed value)
给COM组件的一个属性赋值,参数是:组件模块名,属性名,新值。如果错误,返回false,否则返回 true。
php生成excel文档太简单了,估计大家都会用到,所以共享出来。
大家来看代码:
<?
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=test.xls");
echo "test1 ";
echo "test2
";
echo "test1 ";
echo "test2
";
echo "test1 ";
echo "test2
";
echo "test1 ";
echo "test2
";
echo "test1 ";
echo "test2
";
echo "test1 ";
echo "test2
";
?>
在php环境运行上面的代码,大家就可以看到浏览器询问用户是否下载excel文档,点击保存,硬盘上就多了一个excel的文件,使用excel打开就会看到最终的结果,怎么样不错吧。
其实在做真正的应用的时候,大家可以将数据从数据库中取出,然后按照每一列数据结束后加 ,每一行数据结束后加
的方法echo出来,在php的开头用header("Content-type:application/vnd.ms-excel");表示输出的是excel文件,用header("Content-Disposition:filename=test.xls");表示输出的文件名为text.xls。这样就ok了。
我们更可以修改header让他输出更多格式的文件,这样php在处理各种类型文件方面就更加方便了.
PHP4中使用COM (Windows)--例子
--------------------------------------------------------------------------------
源作者:追风 人气:3108
PHP4 COM的MS Word例子
<?php
#*****************************************************
# 这个例子来自Zend站点,并做了一点修改。
# 将会打开一个Word的实例,
# 输入一行“This is a test...”
# 存为“Useless test.doc”。
#*****************************************************
#实例化一个Word控件
$word = new COM("word.application") or die("不能实例化Word");
#取得并输出版本号
print "载入Word, 版本 {$word->Version}
";
#用com_get取得版本号
$testversion = com_get($word->application,version);
print "用Com_get()取得的版本: $testversion
";
#让Word可见
$word->Visible = 1;
#打开一个新文档
$word->Documents->Add();
#写
$word->Selection->TypeText("This is a test...");
#存
$word->Documents[1]->SaveAs("Useless test.doc");
#手工关闭Word,如果你想看到文档则注释下面这行
$word->Quit();
?>
PHP4 COM的MS Excel例子
<?php
#设置工作簿,
#在这里我们用Excel安装时自带的:SOLVSAMP.XLS
$workbook = "C
rogram FilesMicrosoft officeOfficeSamplesSOLVSAMP.XLS";
$sheet = "Quick Tour";
#实例化工作表控件
$ex = new COM("Excel.sheet") or Die ("Did not connect");
#取得程序名称和版本
print "程序名称:{$ex->Application->value}
" ;
print "版本:{$ex->Application->version}
";
#打开工作簿
$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}
"; #打印内容:10000
$cell->value = 15000; #改为15000
print "New value = {$cell->value}
"; #打印新内容:15000
#最后,重新计算工作表
$sheets->Calculate; #当计算选项是手工时需要
#看看结果total cost(单元格E13)
$cell = $sheets->Cells(13,5) ; #选择单元格
$number = Number_format($cell->value);
print "New Total cost =$$number - was $47,732 before.
";
#将会打印$57,809
#使用Excel的内置函数:
#Function: PMT(percent/12 months,Number of payments,Loan amount)
$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
";
#将会打印monthly payment = $ -1,037.03
#保存改过的工作簿
$ex->Application->ActiveWorkbook->SaveAs("Ourtest");
#关闭所有工作簿
$ex->application->ActiveWorkbook->Close("False");
unset ($ex);
?>
警告/可能的问题
如果你的代码中有错误,你就有可能实例化了一个对象而没有关闭。结果当你改正了错误后有可能已经存在几个实例了,也许会干扰你的结果。解决:当改正了代码的错误之后,清除(
靠!
这么好的帖子,要不是找东西,还真翻不出来。
定出来,大家一起看
一年以前的啊
看看再说
5 条回复
回复