首页 > 后端开发 > php教程 > 如何使用PHP制作Microsoft Word文档

如何使用PHP制作Microsoft Word文档

Jennifer Aniston
发布: 2025-02-20 09:58:10
原创
647 人浏览过

如何使用PHP制作Microsoft Word文档

正如我在上一篇文章PHP和WMI中指出的那样,

- 深入介绍了使用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文件中启用,并且在进行编程之前已重新启动服务器。后端PHP文件是编码过程的焦点,PHP中的COM操作需要在“汇编”中实例化“类”。 为了提高对PIA的编码速度和理解,开发人员可以在C#中开发功能,然后将代码迁移回PHP。 Microsoft关于Office Pia的官方文档是一种有价值的参考材料。
  • >
  • 准备
  • 首先,请确保在Windows开发机器中设置了典型的WAMP环境。由于Interop纯粹是Windows功能,因此我们将不得不在Windows下托管Apache和PHP。在这种情况下,我使用的是EasyPhp 14.1,它非常易于安装和配置。
  • > 接下来,我们将不得不安装Microsoft Office。它的版本并不是那么关键。我正在使用Office 2013 Pro,但是任何时间都比2007年的办公室版本都可以使用。
  • 然后,我们必须确保已安装库来开发Interop应用程序(称为PIA,主互动组件)。为了确定这一点,我们可以打开Windows Explorer并导航到: Assembly,我们将看到一堆已安装的PIAS:
  • >我们看到一个microsoft.office.interop.word输入(在快照中下划线)。这将是我们在此演示中使用的PIA。请特别注意其“组装名称”,“版本”和“公钥令牌”。这些将很快在我们的PHP脚本中使用。

    >

    在此目录中,我们还可以看到可用于编程的其他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表单创建一个简单的前端,看起来像以下图:>

    >我们有一个用于“名称”的文本字段,“性别”的单选按钮组,“年龄”的范围控件以及“消息”的文本区域;最后,当然,一个“提交”按钮。如何使用PHP制作Microsoft Word文档> 在虚拟主机的根目录下的目录中,将此文件另存为“ 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>
    登录后复制
    登录后复制
    登录后复制
    “名称”,“版本”,“公钥令牌”都是从浏览到“ C:WindowsAssembly”时显示的信息。

    “文化”总是中立的。
    <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变量。
    在该文档中,要根据HTML表单的输入创建内容,我们有一些选项。

    >最不利的方法是硬编码PHP中的所有内容,然后输出到Word文档中。由于以下原因,我强烈建议这样做:

    1. >没有灵活性。输出的任何更改都需要修改PHP脚本。
    2. >它违反了控制和表现之间的分离。
    3. 如果要将样式应用于文档内容(对齐,字体,样式等),它将大大增加代码行。通过编程性更改样式太麻烦了。
    另一种方法是进行“搜索替代”。 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>
    登录后复制
    登录后复制
    登录后复制
    >我们还可以选择使用PrintPreview在决定打印文档之前先查看输出。在纯粹的自动化环境中,我们当然会使用打印输出。

    >我们必须等待几秒钟才退出单词应用程序,因为打印作业需要一定时间才能完全被剥离。不延迟(3),$ w->退出立即被执行,印刷作业也被杀死。

    >最后,我们称$ w-> quit(false)关闭了我们的PHP脚本调用的单词应用程序。这里提供的唯一参数是指定是否要在退出之前保存更改。我们确实对文档进行了更改,但我们真的不想保存它们,因为我们想为其他用户的输入保留一个干净的模板。

    >完成代码后,我们可以加载表单页面,输入一些值并提交表单。下图显示了php脚本的输出以及更新的Word文档:>

    如何使用PHP制作Microsoft Word文档
    如何使用PHP制作Microsoft Word文档

    提高编码速度并更多地了解PIA

    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?

    >如何将超链接添加到我的Word文档中?您的Word文档使用PHP使用PHPWord库提供的AddLink()函数。此功能在文档中的当前位置创建超链接。您可以指定超链接的URL和要显示为超链接的文本。

    我可以使用php?

    是的,您可以将列表添加到我的Word文档中吗?是的,您可以将列表添加到您的单词使用PHP的文档。 phpword库提供了一个称为addListItem()的函数,您可以使用该函数将列表项目添加到文档中。您可以指定列表项的文本和列表中项目的深度。您也可以使用与问题3中所述相同的方法将样式应用于列表项目。

    以上是如何使用PHP制作Microsoft Word文档的详细内容。更多信息请关注PHP中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    作者最新文章
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板