手机版

在Windows系统下用PHP生成Word文档教程

时间:2021-09-09 来源:互联网 编辑:宝哥软件园 浏览:

准备工作/即将工作

首先,请确保在您的Windows系统中安装并配置了典型的WAMP环境。因为Interop纯粹是Windows功能,所以我们将在Windows平台下构建Apache和PHP。在这个例子中,我使用了易于安装和配置的EasyPHP 14.1。

接下来,我们将安装微软办公软件。版本不是严格要求的。我正在使用Office2013专业版,但2007年以后的任何Office版本都应该可用。

然后,我们需要确保安装了用于开发Interop应用程序的库(也称为PIA,优先级交互组件)。为了确保这一点,我们可以打开资源管理器并找到Windows目录\程序集,我们将看到以下已安装的PIAs分支:

201573144223171.png  (1050656)

我们可以看到一个微软。Office.Interop.Word条目(此截图中带下划线)。这是我们将在这个例子中使用的PIA。请特别注意其“名称”、“版本”和“公钥标记”。我们将在PHP脚本中使用它们。

在这个目录中,我们还可以看到其他用于编程的PIAs(包括整个Office家族)(不仅是PHP,还有VB.net、C #等。).

如果这个列表不包含微软的整个包。Office.Interop,我们可以重新安装Office并包含PIA在安装中;我们也可以手动下载并安装此软件包。详细的安装步骤可以在这个MSDN页面找到。

注意:只有Microsoft office 2010 pia可再发行版可以单独下载和安装。这个包中的PIA版本是14.0.0。版本15只能通过安装Office获得。

最后,我们需要在php.ini文件中启用PHP扩展php_com_dotnet.dll,并重新启动服务器。

现在我们可以开始编程了。

html表单

因为演示主要集中在后台处理,所以我们在这里使用一个简单的HTML表单来展示前台,应该是这样的:

201573144251848.png  (889757)

我们有一个用于输入“姓名”的文本框、“性别”的单选按钮组、“年龄”的字段值控件、用于编写“消息”的文本字段,最后还有一个“提交”按钮。

将文件命名为“index.html”并保存在虚拟主机的根目录下,这样我们就可以通过URL直接访问该文件,例如:http://test/test/interop

在后台

后台PHP文件是我们讨论的核心。我先贴下面的代码,然后一步一步解释

?php $ inputs=$ _ POST$ inputs[' print date ']=' ';//一个伪值,以避免PHP通知,因为我们在POST变量中没有“printdate”。$assembly='Microsoft。Office.Interop.Word,版本=15.0.0.0,区域性=中性,public key token=71e 9 BCE 111 e 9429 c ';$class='Microsoft。office . Interop . word . application class ';$w=new DOTNET($assembly,$ class);$ w-可见=真;$fn=__DIR__。\ \ template . docx ';$ d=$ w-文档-打开($ fn);回应“文档已打开. brhr”;$ flds=$ d-field;$ Count=$ flds-Count;echo“此文档中有$count字段。br”;回声' ul ';$ mapping=setup field();foreach($ flds as $ index=$ f){ $ f-Select();$ key=$ mapping[$ index];$ value=$ inputs[$ key];if($ key==' gender '){ if($ value==' m ')$ value=' Mr ';else $ value=' Ms} if($ key==' print date ')$ value=date(' Y-m-d h : I :s ');$ w-Selection-type text($ value);echo“LiMAPPig字段$ index: $键值为$ value/Li”;} echo '/ul ';“回声”映射完成!brhr ';“回声”打印。请稍候.br ';$ d-PriutOut();睡眠(3);回声“完成!”;$ w-退出(假);$ w=null函数setupfield(){ $ mapping=array();$ mapping[0]=' gender ';$ mapping[1]=' name ';$ mapping[2]=“age”;$ mapping[3]=' msg ';$ mapping[4]=' print date ';返回$ mapping}在设置了用于获取从表单发送的值的变量$inputs之后,我们将创建一个虚拟值来存储printdate——。我们将在后面讨论为什么需要这个变量。现在,我们看到这四行关键代码:

$assembly='Microsoft。Office.Interop.Word,版本=15.0.0.0,区域性=中性,public key token=71e 9 BCE 111 e 9429 c ';$class='Microsoft。office . Interop . word . application class ';$w=new DOTNET($assembly,$ class);$ w-可见=真;PHP中的COM操作需要请求一个程序集中的类实例。在我们的情况下,我看到我将操作Word。如果我们考虑上一张截图中显示的代码,我们将能够构建一个完全签名的Word PIA:

“名称”、“版本”和“公钥标记”是我们在浏览“c: \ Windows \汇编”时总是中性的信息“文化”。通过调用类编译的文件的后缀名称通常是ApplicationClass。

我们可以通过设置以下两个步骤来初始化word对象:

首先,通过将visible属性设置为true,可以将word对象保存在后台或显示在前台。

然后,我们打开要处理的文档,并将其实例化为$d变量。

在document对象中,基于html表单的文本添加文档的内容。在这里,你可以设置一些参数。最糟糕的方法是对php页面上的所有内容进行硬编码,然后将其添加到word对象中。我强烈建议不要采用这种方法,原因如下:

1代码没有灵活性,php内容的任何变化都需要重新修改;2违反控制层和显示层分离;如果需要设置word内容的格式(对齐方式、字体、样式等。),这种方式大大增加了代码行数,通过编程修改样式非常麻烦。

另一种方法是使用搜索-替换。PHP内置的这个功能非常强大。我们可以创建一个word文档,并在需要替换的占位符内容周围放置一些分隔符。例如,我们创建一个包含以下内容的文档:

{{Name}}在PHP中,我们只需要将其替换为从表单提交中获得的“Name”值。这样就避免了第一种选择的缺点。我们只需要找到正确的分隔符。在这个例子中,除了使用的模板是word文档之外,我们更像是一个模板渲染。

第三个选项是我的建议,是Word中的高级话题。我们将使用字段来表示占位符,在我们的PHP代码中,我们将直接更新相应表单值的字段。

这种方法灵活、快速,符合Word的最佳实践。这也避免了文件的全文搜索,这有助于提高性能。请注意,此选项有其缺点。

总之,Word自问世以来从未支持过命名索引字段。虽然我们为在Word文档中创建的字段提供了名称,但我们仍然需要使用数字下标来访问每个字段。这也解释了为什么我们应该使用特殊函数(setupfields)来完成字段索引和表单字段名称之间的映射

要了解如何在word文档中插入字段(单击此处查看自定义版本),请参考相关的Word帮助主题和手册。对于这个演示,我们有一个包含五个MERGEFIELD字段的文档。此外,我们将文档和PHP脚本放在同一个目录中,以便于访问。

请注意,printdate字段没有对应的表单字段。这就是为什么我们想在$inputs数组中添加一个假的printdate作为键。没有这个键,脚本仍然可以执行,但是会有一个提示,提示索引printdate不存在于$inputs数组中。

用表单数据更新字段值后,我们将使用以下命令打印文档:

$ d-PriutOut();打印输出方法有几个可选参数。这里,我们使用最简单的格式。这将打印一份副本到默认打印机链接到我们的Windows机器。

我们可以通过使用打印预览来打印预览。当然,在纯自动化的情况下,我们直接使用打印输出进行打印。

在退出word应用程序之前,我们需要等待一会儿,因为打印需要时间才能完全退出后台。如果没有延迟(3),$w-Quit将立即执行,打印作业将立即终止。

最后,我们调用$w-Quit(false)来选择通过我们的PHP脚本调用关闭word应用程序。这里提供的唯一参数是指示我们是否要在退出前保存更改。我们确实对文档进行了更改,但是我们不想保存它们,因为我们想为其他用户的输入提供一个干净的模板。

当我们完成编码后,我们可以加载表单页面,输入一些内容并提交表单。下面的截图显示了PHP脚本的输出,并更新了Word文档:

201573144442664.png  (889757)

201573144502426.png  (1663843)

提高编码速度,更好地理解PIA

PHP是一种弱类型语言。组件对象是一种对象类型。在我们的PHP编码过程中,我们不能在一个对象中使用代码的自动提示和完成功能,在一个Word应用程序、一个文档甚至一个字段中也是如此。我们不知道它有什么特性,也不知道它支持什么方法。

这将大大降低我们的发展速度。为了加快开发速度,首先,我建议将我们在c#中开发的函数迁移到我们的PHP代码中。我推荐一个免费的C# IDE叫做' #develop ',可以在这里下载。与VS相比,我更喜欢这个软件,因为#develop更小,更简单,响应更快。

将C#代码迁移到PHP一点也不可怕。我先展示一些C#代码:复制代码如下:Word。应用程序w=newword。application();可见=真;字符串路径=应用程序。StartupPath ' \ \ template.docx一言为定。文档d=w.Documents .作为Word打开(路径)。文件;一言为定。字段flds=d .字段;int len=flds。计数;foreach (Word。fld中的字段f){ f . Select();指数;w.Selection.TypeText(' . ');}

我们可以看到C#的代码与我们之前展示的PHP的代码基础完全相同。因为C#是一种强类型语言,所以我们可以看到一些类型转换的语句,并且我们必须显式地为我们的变量分配一个类型。

有了代码的类型,我们就可以享受代码的自动提示和代码的自动完成,这样我们的开发速度就会大大提高。

另一种更快开发PHP的方法是使用Word的宏命令。让我们先操作需要重复的动作,然后用宏记录下来。一个宏其实就是Visual Basic,也很容易翻译成PHP。

最重要的是,Office PIA的微软官方文档,尤其是文档中每个Office应用程序的命名空间,永远是我们最需要的参考。三种常用的应用如下:

excel 2013:http://msdn . Microsoft.com/en-us/library/Microsoft . office . interop . excel(v=office . 15)。aspx Word 2013:http://msdn . Microsoft.com/en-us/library/Microsoft。office . interop . word(v=office . 15)。msdn.microsoft.com/en-us/library/Microsoft.办公室。aspx结论

在本文中,我们演示了如何使用PHP COM库和Microsoft Office Interop函数来创建Word文档。

Windows和Office在我们的日常生活中被广泛使用。任何一个在Windows平台上开发PHP的程序员,都有必要了解和理解Office或Windows的威力。

使用PHP的COM扩展,掌握这个组合的大门就打开了。

如果你对编程的这一部分感兴趣,请留下你的评论,我们会考虑写更多关于这个主题的文章。我期待着使用这种方法进行更多的实际应用程序开发。

版权声明:在Windows系统下用PHP生成Word文档教程是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。