PHP4(windows版本)中的COM函数

PHP4(windows版本)中的COM函数

这几天一直在写excel转化成mysql,发现一篇文章,搜一下phpx论坛,没有这个帖子,把它转帖如下:

PHP4(windows版本)中的COM函数

介绍

内置于PHP4里的COM函数对于我们在win32环境下开发程序是相当有吸引力的,但是至今仍没有多少相关的技术文档。本文将以三个例子分

别处理 MS office 2000 Word 、 Excel 、 Adobe Distiller 来说明如何在PHP中使用COM函数。

COM技术是由Microsoft在几年前提出并开发的,本文中提到的相关名词有OLE, OLE Automation, 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 程序标识":

$instance = new COM("$identifier");

?>

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

地访问它的方法与属性。

例如:

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

?>

就是这么简单!

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

bool com_set(class com_object, string property name, string property_value);

mixed com_get(class com_object, string property_name);

?>

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

$Instance = new COM(string "Component name", string "remote_server_address");

?>

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

标识、方法和属性

标识是一个如下的字串:

MS Word: "Word.Application" or "Word.Application.9"
MS Excel: "Excel.Application" or "Excel.Sheet"
ADOBE Acrobat: "Exch.application" or "PdfDistiller.PdfDistiller"

对于最后一个标识,我要指明的是,获得正确的对象标识名不是一件容易的事。如果你不能访问VBA文档,你可以查找一下windows的注册

表,在 HKEY_CLASSES_ROOT 中寻找一下,你就可以得到一些应用程序的名字。在你的机器上有效的对象标识放在 CLSID 子文件夹下。

应用程序一般会提供文档说明它的COM方法和属性。在office2000中,你可以运行程序,打开VBA编辑器 ,选择对象编辑器。输入应用程序

库中的一个方法名或属性名,然后,在下面的窗口中用鼠标右键选择一个类或成员名称,点帮助,你就会得到关于这个类或成员的描述。你也

可以参考 MSDN。一个 Excel 的例子如下: [url]http://msdn.microsoft.com/library/officedev/off2000/xltocobjectmodelapplication.htm[/url]

用COM函数操作 MS Word

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

#*********************************************************
# 本例来自Zend站点,略有改动
# 打开一个word实例,并新建一个文档Useless test.doc
# 输入一行文字 "This is a test2..."
#*********************************************************

#实例化一个对象

$word = new COM("word.application") or die("Unable to instantiate Word");

#取得并显示版本

print "Loaded Word, version {$word->Version}
";

#另一种方法去取得版本

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

print "Version using Com_get(): $testversion
";

#使其可见

$word->Visible = 1;

#创建新文件

$word->Documents->Add();

#写字符

$word->Selection->TypeText("This is a test...");

#保存

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

#关闭

$word->Quit();

?>

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

MS Excel在使用PHP的COM函数

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

#打开workbook和它的sheet,
#本例使用一个电子表格是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}
" ;
print "Loaded version: {$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 (Advertising in the 4th. Quarter)
$sheets = $wkb->Worksheets($sheet); #Select the sheet
$sheets->activate; #Activate it
$cell = $sheets->Cells(11,5) ; #Select the cell (Row Column number)
$cell->activate; #Activate the cell
print "Old Value = {$cell->value}
"; #Print the value of the cell:10000
$cell->value = 15000; #Change it to 15000
print "New value = {$cell->value}
";#Print the new value=15000

#最后,用新值重新计算这个单元格
$sheets->Calculate;
#必须的如果要计算,手动则是可选的
#可看到效果总价值(E13单元格)
$cell = $sheets->Cells(13,5) ; #Select the cell (Row Column number)
$number = Number_format($cell->value);
print "New Total cost =$$number - was $47,732 before.
";
#根据计算公式,广告影响了公司的开销,这里将显示 $57,809

#使用Excel内建的函数
# 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
";

#Should print monthly payment = $ -1,037.03

#可选,保存
$ex->Application->ActiveWorkbook->SaveAs("Ourtest");
#关闭,不提问
$ex->application->ActiveWorkbook->Close("False");
unset ($ex);

?>

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

用PHP的COM访问 Adobe Distiller

这最后一个例子不是MS程序了,如果你的程序有一个PostScript文件,你会对这个有兴趣的,改写(蒸馏)它成为一个PDF文档. Adobe 有一

个程序叫 Distiller ,它可以生成一个实例。代码如下:

$pdf = new COM("pdfdistiller.pdfdistiller.1");

?>

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

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

$pdf->FileToPdf ($psfile, strOutputPDF '', strJobOptions "");

?>

这 $psfile 是这个PostScript的文件名, strOutputPDF 是输出文件PDF的文件名。 StrJobOptions 是Distiller的参数文件名,最后两个参数

是可选的,默认是同一名字。 这PS文件名与PDF文件名,使用这个默认的Joboptions 文件。例如:

$pdf->FileToPdf ($psfile, "", "");
#这儿$psfile 可以是 Myfile.ps 将返回 Myfile.pdf 文件。

?>

在Distiller中有更多的方法和属性能被用。如果你感兴趣,请参考一下Adobe的技术文档。

中止/可能的问题

如果你的代码中发生了什么错误,你可能会创建了一个实例,但没有正常地关闭它。最糟的是,这个应用程序可能被这个实例所保持,结

果,在你的程序列表中就存在多份这个程序的副本,即使你更正了这个错误也会干扰你的结果。解决方法是:修正一个bug以来要及时清除它们

在你重新开始运行之前,用 并结束任务。同样的原因,在你的代码最后,也要及时关闭这个程序并删除这个实例。

你有一些技巧在处理 com_get 和 com_set的异常时。例如:
$Version = Com_get($instance->Application,"Version");

将会在Word中工作但在Excel中会产生一个错误。

有一些对象在PHP4中是不能实例化的,这是因为这个程序要一个自定义的接口,但PHP4不支持。

为什么我们要用它?

我希望这三个例子可以给你一些思考的线索,PHP的COM允许你在PHP的脚本中访问windows4的程序。这个代码比ASP简单并且能集成其它的

PHP对数据库强大的支持功能。Microsoft 在各个方面都大力销售这个COM 技术,在不同的名称和结构下,如 COM+(Combine COM with

Microsoft Transaction Server MTS), ADO, OLE DB, OWC, Windows DNA, 等等。 PHP 和 Apache的结合,提供了一个开放源码的解决方案。

(0)

相关推荐

  • PHP4(windows版本)中的COM函数

    PHP4(windows版本)中的COM函数 这几天一直在写excel转化成mysql,发现一篇文章,搜一下phpx论坛,没有这个帖子,把它转帖如下: PHP4(windows版本)中的COM函数 介绍 内置于PHP4里的COM函数对于我们在win32环境下开发程序是相当有吸引力的,但是至今仍没有多少相关的技术文档.本文将以三个例子分 别处理 MS office 2000 Word . Excel . Adobe Distiller 来说明如何在PHP中使用COM函数. COM技术是由Micro

  • vue3中的render函数里定义插槽和使用插槽

    目录 render函数里定义插槽和使用插槽 定义插槽 定义有插槽的组件使用插槽 vue3 render函数小变动 render函数的参数 render函数签名 VNode属性格式 render函数里定义插槽和使用插槽 vue3中this.slots和vue2的区别 vue3:this.slots是一个{ [name: string]: (…args: any[]) => Array | undefined }的对象,每个具名插槽的内容都要通过函数调用.如v-slot:foo插槽分发的内容通过th

  • PowerShell中查看当前版本、Windows版本、.NET版本信息的代码

    PowerShell查看当前版本.Windows版本..NET版本信息 有很多cmdlet或者cmdlet的参数,在PowerShell不同的版本中,支持得不一样.所以,弄清楚当前PowerShell的版本信息是非常重要的一件事情.那么怎么查看当前PowerShell的版本信息呢?洪哥向大家介绍两个方法: 其实就是两个PowerShell的环境变量,一个是$psversiontable,另一个是$host. 有很多cmdlet或者cmdlet的参数,在PowerShell不同的版本中,支持得不一

  • windows系统中Python多版本与jupyter notebook使用虚拟环境的过程

    本人电脑是windows系统,装了Python3.7版本,但目前tensorflow支持最新的python版本为3.6,遂想再安装Python3.6以跑tensorflow. 因为看极客时间的专栏提到Jupyter是个科学运算语言的计算工具,特别适合机器学习与数学统计,因此也要装个体验一翻. 一.安装Python 电脑原先已经装了Python3.7,virtualenv,virtualenvwrapper,jupyter notebook. 在官网上直接下载windows版本的python3.6

  • windows环境中利用celery实现简单任务队列过程解析

    这篇文章主要介绍了windows环境中利用celery实现简单任务队列过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.背景 最近因项目需要,学习任务队列Celery的用法; 二.测试使用环境: 1.Windows7 x64 2.Python == 3.7.5 3.celery == 4.3.0 4.redis =3.3.11 5.eventlet==0.25.1 ==> pip install eventlet (windows环境

  • Windows系统中搭建Go语言开发环境图文详解

    目录 1.Go语言简介 2.安装Git 3.Go 工具链(编译器)安装 3.1.环境变量GOROOT 3.2.环境变量GOPATH 3.3.Go常用命令 4.包管理 4.1.go module 4.2.gopm 5.编写Go语言代码的IDE或编辑工具 5.1.基于VSCode的Go开发环境 5.1.1.安装VSCode 5.1.2.安装插件 5.1.3.常用配置 5.2.GoLand 5.3.Vim 5.4.其他Go代码编写工具 6.Go语言学习资料分享 本文详细讲述如何在 Windows 系统

  • VBA中的Timer函数用法

    第1.40例 Timer 函数 一.题目: 要求编写一段代码,运用 Timer 函数来计算本代码运行所化的时间. 二.代码: Sub 示例_1_040() Dim t, i&, a t = Timer For i = 1 To 1000000 a = a + i Next i MsgBox Timer - t & "秒" '返回0.046875秒 End Sub 三.代码详解 1.Sub 示例_1_040():宏程序的开始语句.宏名为示例_1_040. 2.Dim t,

  • python 中的int()函数怎么用

    int(x, [base]) 功能: 函数的作用是将一个数字或base类型的字符串转换成整数. 函数原型: int(x=0) int(x, base=10),base缺省值为10,也就是说不指定base的值时,函数将x按十进制处理. 适用Python版本: Python2.x Python3.x 注意: 1. x 可以是数字或字符串,但是base被赋值后 x 只能是字符串 2. x 作为字符串时必须是 base 类型,也就是说 x 变成数字时必须能用 base 进制表示 Python英文文档解释

  • Windows 8 中的 PowerShell 3.0

    Windows 8 惊艳登场,当Metro界面吸引了无数人的眼球时,其实还有很多特性值得关注,如PowerShell 3.0.Hyper-V 3.0.vhdx.IIS 8等. PowerShell 2.0实践系列从本次开始全面转向3.0,体验一下PowerShell 3.0带来的管理方案提升. 很庆幸PowerGUI Script Editor 可以在Windows 8下安装:官方下载 本系列全部脚本在Windows 8 x64(PowerShell 3.0) + PowerGUI Script

  • 如何解决Windows Vista中无法通过锐捷认证上网的问题

    许多学校在寝室里上网都需要一个认证软件,连上内网之后才能通过VPN上外网,而在Windows Vista下面这些个软件可能工作不正常,从而在Windows Vista里不能上网.很不幸,我们学校就是其中这一. 寝室上网需要先用锐捷连上内网,再通过VPN连接外网.刚开始的时候,弄了半天,锐捷客户端硬是不能获取网卡信息,然后在Windows Vista里右下角的网络图标提示信息显示为"未识别的网络",然后VPN拨号不可用. 在网上翻了一大会,终于给找到了解决办法,下面是步骤: 1. 下载并

随机推荐