- 深入介绍了使用PHP的Windows,我们确实生活在一个世界上,我们的PHP开发人员必须不时处理Windows操作系统。 WMI(Windows Management界面)就是一个场合,Microsoft Office Interop是另一个场合 - 更重要,更频繁地使用。 在本文中,我们将看到Word和PHP之间的简单集成:要使用PHP(及其Intop Extension)基于HTML形式的输入来生成Microsoft Word文档。
>钥匙要点
如果PIAS列表不包括Microsoft.office.interop的整个包,我们将重新安装我们的办公室并包括PIA功能;或者,我们必须从Microsoft手动下载该软件包并安装它。请咨询此MSDN页面以获取详细说明。
注意:只有Microsoft Office 2010 PIA重新分布可下载和安装。此软件包中的PIA版本为14.0.0。版本15仅带有Office 2013安装。
最后,我们必须在php.ini文件中启用PHP扩展PHP_COM_DOTNET.DLL并重新启动服务器。现在我们可以继续进行编程。
html形式
>我们有一个用于“名称”的文本字段,“性别”的单选按钮组,“年龄”的范围控件以及“消息”的文本区域;最后,当然,一个“提交”按钮。>
在虚拟主机的根目录下的目录中,将此文件另存为“ index.html”,以便我们可以使用http:// test/test/test/Interop。
>后端PHP文件是我们讨论的重点。我将首先列出此文件的代码,然后逐步进行解释。
<span><span><?php </span></span><span> </span><span><span>$inputs = $_POST; </span></span><span><span>$inputs['printdate']=''; </span></span><span><span>// A dummy value to avoid a PHP notice as we don't have "printdate" in the POST variables. </span></span><span> </span><span><span>$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'; </span></span><span><span>$class = 'Microsoft.Office.Interop.Word.ApplicationClass'; </span></span><span> </span><span><span>$w = new DOTNET($assembly, $class); </span></span><span><span>$w->visible = true; </span></span><span> </span><span><span>$fn = __DIR__ . '\template.docx'; </span></span><span> </span><span><span>$d = $w->Documents->Open($fn); </span></span><span> </span><span><span>echo "Document opened.<br><hr>"; </span></span><span> </span><span><span>$flds = $d->Fields; </span></span><span><span>$count = $flds->Count; </span></span><span><span>echo "There are <span><span>$count</span> fields in this document.<br>"</span>; </span></span><span><span>echo "<ul>"; </span></span><span><span>$mapping = setupfields(); </span></span><span> </span><span><span>foreach ($flds as $index => $f) </span></span><span><span>{ </span></span><span> <span>$f->Select(); </span></span><span> <span>$key = $mapping[$index]; </span></span><span> <span>$value = $inputs[$key]; </span></span><span> <span>if ($key == 'gender') </span></span><span> <span>{ </span></span><span> <span>if ($value == 'm') </span></span><span> <span>$value = 'Mr.'; </span></span><span> <span>else </span></span><span> <span>$value = 'Ms.'; </span></span><span> <span>} </span></span><span> </span><span> <span>if($key=='printdate') </span></span><span> <span>$value= date ('Y-m-d H:i:s'); </span></span><span> </span><span> <span>$w->Selection->TypeText($value); </span></span><span> <span>echo "<li>Mappig field <span><span>$index</span>: <span>$key</span> with value <span>$value</span></li>"</span>; </span></span><span><span>} </span></span><span><span>echo "</ul>"; </span></span><span> </span><span><span>echo "Mapping done!<br><hr>"; </span></span><span><span>echo "Printing. Please wait...<br>"; </span></span><span> </span><span><span>$d->PrintOut(); </span></span><span><span>sleep(3); </span></span><span><span>echo "Done!"; </span></span><span> </span><span><span>$w->Quit(false); </span></span><span><span>$w=null; </span></span><span> </span><span> </span><span> </span><span><span>function setupfields() </span></span><span><span>{ </span></span><span> <span>$mapping = array(); </span></span><span> <span>$mapping[0] = 'gender'; </span></span><span> <span>$mapping[1] = 'name'; </span></span><span> <span>$mapping[2] = 'age'; </span></span><span> <span>$mapping[3] = 'msg'; </span></span><span> <span>$mapping[4] = 'printdate'; </span></span><span> </span><span> </span><span> <span>return $mapping; </span></span><span><span>}</span></span>
“文化”总是中立的。
<span>$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'; </span><span>$class = 'Microsoft.Office.Interop.Word.ApplicationClass'; </span> <span>$w = new DOTNET($assembly, $class); </span><span>$w->visible = true;</span>
我们要调用的类始终是汇编的名称加上“ .applicationClass”。
>最不利的方法是硬编码PHP中的所有内容,然后输出到Word文档中。由于以下原因,我强烈建议这样做:
{{name}}
和在PHP中,我们可以简单地用我们从表单提交表单中检索的“名称”值替换。
>
>这很简单,避免了第一个选项中的所有缺点。我们只需要找到正确的定界符,在这种情况下,我们更喜欢进行模板渲染,只是使用的模板现在是Word文档。第三个选项是我的建议,是Word中的高级主题。我们将使用字段来表示占位符,并且在我们的PHP代码中,我们将以各自的形式值直接更新字段。
这种方法是灵活的,快速的,并且符合Word的最佳实践。它还避免了文档中的全文搜索,这有助于性能。请注意,此选项也有其缺点。
自首次亮相以来,Word从未支持命名为字段的索引。即使我们为在Word文档中创建的字段提供了一个名称,我们仍然必须使用编号下网访问每个字段。这也解释了为什么我们必须使用专用函数(SetupFields)来在字段索引和表单字段的名称之间进行手动映射。
>了解如何在Word文档中插入字段(单击此处以获取现成的版本),请咨询相关的Word帮助主题和手册。对于此演示,我们有一个带有5个Mergefield字段的文档。另外,我们将文档与PHP脚本相同的目录放置在同一目录中,以方便访问。
请注意,字段printdate没有相应的表单字段。这就是为什么我们在$ Inputs数组中添加了一个虚拟打印键的原因。没有此事,脚本仍然可以运行,但会注意到索引printdate不会在$ inputs数组中介绍。
>>使用表单值更新字段后,我们将使用以下方式打印文档
打印输出方法具有一些可选参数,我们使用其最简单的形式。这将将一个副本打印到连接到我们的Windows机器的默认打印机。
<span><span><?php </span></span><span> </span><span><span>$inputs = $_POST; </span></span><span><span>$inputs['printdate']=''; </span></span><span><span>// A dummy value to avoid a PHP notice as we don't have "printdate" in the POST variables. </span></span><span> </span><span><span>$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'; </span></span><span><span>$class = 'Microsoft.Office.Interop.Word.ApplicationClass'; </span></span><span> </span><span><span>$w = new DOTNET($assembly, $class); </span></span><span><span>$w->visible = true; </span></span><span> </span><span><span>$fn = __DIR__ . '\template.docx'; </span></span><span> </span><span><span>$d = $w->Documents->Open($fn); </span></span><span> </span><span><span>echo "Document opened.<br><hr>"; </span></span><span> </span><span><span>$flds = $d->Fields; </span></span><span><span>$count = $flds->Count; </span></span><span><span>echo "There are <span><span>$count</span> fields in this document.<br>"</span>; </span></span><span><span>echo "<ul>"; </span></span><span><span>$mapping = setupfields(); </span></span><span> </span><span><span>foreach ($flds as $index => $f) </span></span><span><span>{ </span></span><span> <span>$f->Select(); </span></span><span> <span>$key = $mapping[$index]; </span></span><span> <span>$value = $inputs[$key]; </span></span><span> <span>if ($key == 'gender') </span></span><span> <span>{ </span></span><span> <span>if ($value == 'm') </span></span><span> <span>$value = 'Mr.'; </span></span><span> <span>else </span></span><span> <span>$value = 'Ms.'; </span></span><span> <span>} </span></span><span> </span><span> <span>if($key=='printdate') </span></span><span> <span>$value= date ('Y-m-d H:i:s'); </span></span><span> </span><span> <span>$w->Selection->TypeText($value); </span></span><span> <span>echo "<li>Mappig field <span><span>$index</span>: <span>$key</span> with value <span>$value</span></li>"</span>; </span></span><span><span>} </span></span><span><span>echo "</ul>"; </span></span><span> </span><span><span>echo "Mapping done!<br><hr>"; </span></span><span><span>echo "Printing. Please wait...<br>"; </span></span><span> </span><span><span>$d->PrintOut(); </span></span><span><span>sleep(3); </span></span><span><span>echo "Done!"; </span></span><span> </span><span><span>$w->Quit(false); </span></span><span><span>$w=null; </span></span><span> </span><span> </span><span> </span><span><span>function setupfields() </span></span><span><span>{ </span></span><span> <span>$mapping = array(); </span></span><span> <span>$mapping[0] = 'gender'; </span></span><span> <span>$mapping[1] = 'name'; </span></span><span> <span>$mapping[2] = 'age'; </span></span><span> <span>$mapping[3] = 'msg'; </span></span><span> <span>$mapping[4] = 'printdate'; </span></span><span> </span><span> </span><span> <span>return $mapping; </span></span><span><span>}</span></span>
>我们必须等待几秒钟才退出单词应用程序,因为打印作业需要一定时间才能完全被剥离。不延迟(3),$ w->退出立即被执行,印刷作业也被杀死。
>最后,我们称$ w-> quit(false)关闭了我们的PHP脚本调用的单词应用程序。这里提供的唯一参数是指定是否要在退出之前保存更改。我们确实对文档进行了更改,但我们真的不想保存它们,因为我们想为其他用户的输入保留一个干净的模板。
>完成代码后,我们可以加载表单页面,输入一些值并提交表单。下图显示了php脚本的输出以及更新的Word文档:
>这将大大降低我们的发展速度。为了使其更快,我建议我们首先开发C#中的功能,然后将代码迁移回PHP。我推荐的免费C#IDE称为“ #Develop”,可以在此处下载。我更喜欢VS系列,因为#Develops较小,更干净,更快。
> C#代码向PHP的迁移根本不是可怕的。让我向您展示C#代码的一些行:
>我们可以看到C#代码几乎与我们先前显示的PHP代码相同。 c#是强烈键入的,因此我们看到一些类型的铸造语句,我们必须明确地给我们的变量一种类型。
<span><span><?php </span></span><span> </span><span><span>$inputs = $_POST; </span></span><span><span>$inputs['printdate']=''; </span></span><span><span>// A dummy value to avoid a PHP notice as we don't have "printdate" in the POST variables. </span></span><span> </span><span><span>$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'; </span></span><span><span>$class = 'Microsoft.Office.Interop.Word.ApplicationClass'; </span></span><span> </span><span><span>$w = new DOTNET($assembly, $class); </span></span><span><span>$w->visible = true; </span></span><span> </span><span><span>$fn = __DIR__ . '\template.docx'; </span></span><span> </span><span><span>$d = $w->Documents->Open($fn); </span></span><span> </span><span><span>echo "Document opened.<br><hr>"; </span></span><span> </span><span><span>$flds = $d->Fields; </span></span><span><span>$count = $flds->Count; </span></span><span><span>echo "There are <span><span>$count</span> fields in this document.<br>"</span>; </span></span><span><span>echo "<ul>"; </span></span><span><span>$mapping = setupfields(); </span></span><span> </span><span><span>foreach ($flds as $index => $f) </span></span><span><span>{ </span></span><span> <span>$f->Select(); </span></span><span> <span>$key = $mapping[$index]; </span></span><span> <span>$value = $inputs[$key]; </span></span><span> <span>if ($key == 'gender') </span></span><span> <span>{ </span></span><span> <span>if ($value == 'm') </span></span><span> <span>$value = 'Mr.'; </span></span><span> <span>else </span></span><span> <span>$value = 'Ms.'; </span></span><span> <span>} </span></span><span> </span><span> <span>if($key=='printdate') </span></span><span> <span>$value= date ('Y-m-d H:i:s'); </span></span><span> </span><span> <span>$w->Selection->TypeText($value); </span></span><span> <span>echo "<li>Mappig field <span><span>$index</span>: <span>$key</span> with value <span>$value</span></li>"</span>; </span></span><span><span>} </span></span><span><span>echo "</ul>"; </span></span><span> </span><span><span>echo "Mapping done!<br><hr>"; </span></span><span><span>echo "Printing. Please wait...<br>"; </span></span><span> </span><span><span>$d->PrintOut(); </span></span><span><span>sleep(3); </span></span><span><span>echo "Done!"; </span></span><span> </span><span><span>$w->Quit(false); </span></span><span><span>$w=null; </span></span><span> </span><span> </span><span> </span><span><span>function setupfields() </span></span><span><span>{ </span></span><span> <span>$mapping = array(); </span></span><span> <span>$mapping[0] = 'gender'; </span></span><span> <span>$mapping[1] = 'name'; </span></span><span> <span>$mapping[2] = 'age'; </span></span><span> <span>$mapping[3] = 'msg'; </span></span><span> <span>$mapping[4] = 'printdate'; </span></span><span> </span><span> </span><span> <span>return $mapping; </span></span><span><span>}</span></span>
>给出了可变类型,我们可以享受代码洞察力和代码完成,因此开发速度要快得多。
>加快PHP开发的另一种方法是利用单词宏。我们执行相同的操作,并用宏记录它们。宏位于Visual Basic中,也可以很容易地转换为PHP。
最重要的是,微软关于Office PIA的官方文档,尤其是每个办公室应用程序的名称空间文档,始终是最详细的参考材料。大多数使用的三个应用程序是:窗户和办公室在日常生活中广泛使用。要了解Office/Windows和PHP的功能,对于任何PHP Windows程序员都是必不可少的。
>随着PHP的com扩展,掌握此组合的门将打开。
如果您对该编程领域感兴趣,请发表评论,我们将考虑有关此主题的更多文章。我期待看到使用这种方法开发的更多现实世界应用程序。
经常询问的问题(常见问题解答)有关使用PHP
>创建Microsoft Word文档我可以使用php吗?
>我如何使用PHP?使用PHP Word库中,使用PHP在Word文档中发短信很容易。您可以使用AddText()函数将文本添加到文档中,并且可以将样式数组指定为此函数的第二个参数。此样式阵列可以包括字体大小,字体颜色,粗体,斜体,下划线等属性。您还可以使用addTitLesty()或AddParagraphStyle()函数创建样式对象,然后将其应用于您的文本。
>将HTML转换为Word文档,是的,您可以使用PHP将HTML转换为Word文档。 phpword库提供了一个称为addhtml()的函数,您可以使用该功能将HTML内容添加到文档中。此函数解析了HTML内容,并将其转换为可以在Word文档中显示的格式。但是,请注意,并非所有HTML标签都得到支持,并且某些复杂的HTML结构可能无法正确转换。使用PHP创建Word文档,您可以使用PHPWord库提供的Save()函数将其保存到特定位置。此功能采用路径到达要将文档保存为参数的位置。如果不存在指定的位置,则该功能将尝试创建它。如果该函数无法创建位置或保存文档,则会抛出异常。
是的,您可以添加标题和页脚。使用php的Word文档的标题和页脚。 phpword库提供了称为Addheader()和AddFooter()的功能,您可以将其用于文档中的标题和页脚。然后,您可以使用AddText()函数将文本添加到标题和页脚中。您也可以使用与问题3中所述相同的方法应用于标题和页脚的样式通过使用PHPWord库提供的AddPageBreak()函数,使用PHP使用PHP。此函数插入文档中当前位置的页面中断,导致所有后续内容出现在新页面上。
>
>如何使用php?我可以使用php?是的,您可以将列表添加到我的Word文档中吗?是的,您可以将列表添加到您的单词使用PHP的文档。 phpword库提供了一个称为addListItem()的函数,您可以使用该函数将列表项目添加到文档中。您可以指定列表项的文本和列表中项目的深度。您也可以使用与问题3中所述相同的方法将样式应用于列表项目。
以上是如何使用PHP制作Microsoft Word文档的详细内容。更多信息请关注PHP中文网其他相关文章!