如何使用PHP制作Microsoft Word文档
- 深入介绍了使用PHP的Windows,我们确实生活在一个世界上,我们的PHP开发人员必须不时处理Windows操作系统。 WMI(Windows Management界面)就是一个场合,Microsoft Office Interop是另一个场合 - 更重要,更频繁地使用。 在本文中,我们将看到Word和PHP之间的简单集成:要使用PHP(及其Intop Extension)基于HTML形式的输入来生成Microsoft Word文档。
>钥匙要点
PHP开发人员可以使用PHP及其Interop扩展。 为了成功集成,需要与Microsoft Office和图书馆一起开发Interop应用程序(PIA,主要的Interop组件)。
> PHP扩展PHP_COM_DOTNET.DLL需要在PHP.Ini文件中启用,并且在进行编程之前已重新启动服务器。>
在此目录中,我们还可以看到可用于编程的其他PIA(包括整个办公室)(不仅适用于PHP,而且适用于VB.NET,C#等)如果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形式
作为此演示的焦点是后端处理,我们将使用简单的HTML表单创建一个简单的前端,看起来像以下图::>
>我们有一个用于“名称”的文本字段,“性别”的单选按钮组,“年龄”的范围控件以及“消息”的文本区域;最后,当然,一个“提交”按钮。>
在虚拟主机的根目录下的目录中,将此文件另存为“ index.html”,以便我们可以使用http:// test/test/test/Interop。
>后端PHP文件是我们讨论的重点。我将首先列出此文件的代码,然后逐步进行解释。
设置$ Inputs变量以保留从我们的表单中发布的值并为PrintDate创建虚拟值 - 我们将讨论为什么以后需要它 - 我们遇到了这四个关键行:>
PHP中的COM操作需要在“组装”中实例化“类”。在我们的情况下,我们要用单词进行操作。如果我们反思了我们显示的第一个屏幕截图,我们将能够构建PIA一词的完整签名:
<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”。
- >设置了这两个参数,我们将能够实例化一个单词对象。
- 这个对象可以保留在后台,或者我们可以将其可见属性设置为true来将其带到前景。
- 接下来,我们打开要处理的文档,并将“文档”实例分配给$ d变量。
>最不利的方法是硬编码PHP中的所有内容,然后输出到Word文档中。由于以下原因,我强烈建议这样做:
- >没有灵活性。输出的任何更改都需要修改PHP脚本。
- >它违反了控制和表现之间的分离。 如果要将样式应用于文档内容(对齐,字体,样式等),它将大大增加代码行。通过编程性更改样式太麻烦了。
{{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文档:
PHP是一种弱打字的语言。 com对象是类型对象。在我们的PHP编码期间,无论是单词应用程序,文档还是字段,都无法从对象中获得有意义的代码洞察力。我们不知道它拥有哪些属性或它支持的方法。
>这将大大降低我们的发展速度。为了使其更快,我建议我们首先开发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的官方文档,尤其是每个办公室应用程序的名称空间文档,始终是最详细的参考材料。大多数使用的三个应用程序是:- excel 2013:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.interop.excel(v = office.15).aspx
- Word 2013:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word(V=Office.15).aspx
- PowerPoint 2013:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.interop.powerpoint(v = office.15).aspx
结论
在本文中,我们演示了如何使用PHP COM库和Microsoft Office Interop功能填充Word文档。窗户和办公室在日常生活中广泛使用。要了解Office/Windows和PHP的功能,对于任何PHP Windows程序员都是必不可少的。
>随着PHP的com扩展,掌握此组合的门将打开。
如果您对该编程领域感兴趣,请发表评论,我们将考虑有关此主题的更多文章。我期待看到使用这种方法开发的更多现实世界应用程序。
经常询问的问题(常见问题解答)有关使用PHP
>创建Microsoft Word文档>如何使用PHP?
>使用PHP向您的Word文档添加图像是一个简单的过程。您可以使用phpword库提供的Addimage()函数。此功能使您可以指定要添加的图像文件的路径。您还可以指定其他参数,例如宽度,高度和对齐,以自定义文档中图像的外观。请记住要在您的PHP脚本中包括必要的标题,以确保正确解释并显示在Word文档中。
>我可以使用php吗?
在Word Document中创建表格使用PHP在Word文档中创建表。 phpword库提供了一个称为addtable()的函数,您可以在文档中使用该函数来创建表。然后,您可以使用addrow()和addCell()函数将行和列添加到表中。您还可以指定表格及其单元格的宽度,高度和对齐方式来自定义其外观。
>>我如何使用PHP?使用PHP Word库中,使用PHP在Word文档中发短信很容易。您可以使用AddText()函数将文本添加到文档中,并且可以将样式数组指定为此函数的第二个参数。此样式阵列可以包括字体大小,字体颜色,粗体,斜体,下划线等属性。您还可以使用addTitLesty()或AddParagraphStyle()函数创建样式对象,然后将其应用于您的文本。
>>我可以使用php?
将HTML转换为Word文档,是的,您可以使用PHP将HTML转换为Word文档。 phpword库提供了一个称为addhtml()的函数,您可以使用该功能将HTML内容添加到文档中。此函数解析了HTML内容,并将其转换为可以在Word文档中显示的格式。但是,请注意,并非所有HTML标签都得到支持,并且某些复杂的HTML结构可能无法正确转换。使用PHP创建Word文档,您可以使用PHPWord库提供的Save()函数将其保存到特定位置。此功能采用路径到达要将文档保存为参数的位置。如果不存在指定的位置,则该功能将尝试创建它。如果该函数无法创建位置或保存文档,则会抛出异常。
我可以使用php?
是的,您可以添加标题和页脚。使用php的Word文档的标题和页脚。 phpword库提供了称为Addheader()和AddFooter()的功能,您可以将其用于文档中的标题和页脚。然后,您可以使用AddText()函数将文本添加到标题和页脚中。您也可以使用与问题3中所述相同的方法应用于标题和页脚的样式通过使用PHPWord库提供的AddPageBreak()函数,使用PHP使用PHP。此函数插入文档中当前位置的页面中断,导致所有后续内容出现在新页面上。
我可以使用php?
是的,可以从模板中创建一个Word文档,您可以使用PHP从模板中创建Word文档。 phpword库提供了一个称为loadTemplate()的函数,您可以使用该函数来加载Word文档模板。然后,您可以使用setValue()函数用自己的内容替换模板中的占位符文本。>
>如何使用php?我可以使用php?是的,您可以将列表添加到我的Word文档中吗?是的,您可以将列表添加到您的单词使用PHP的文档。 phpword库提供了一个称为addListItem()的函数,您可以使用该函数将列表项目添加到文档中。您可以指定列表项的文本和列表中项目的深度。您也可以使用与问题3中所述相同的方法将样式应用于列表项目。
以上是如何使用PHP制作Microsoft Word文档的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。
