在Windows系统下使用PHP生成Word文档的教程(2)

文档对象中,基于html表单的文本来添加文档的内容,这里可以设置一些参数。
最不好的方式是对php页面上所有内容进行硬编码,然后将它们添加到word对象中。我强烈建议不采用此种方式,原因有:

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


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

{{name}}

在PHP中,我们只需使用从表单提交中获取的“Name”值来替换。这种方式避免了第一选项中的那些缺点。我们只需要找到正确的分隔符,在这个例子中,除了使用的模板是word文档,我们更像是做一个模板渲染。


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

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

总之,自从首次亮相,Word从来没有支持命名索引的字段。尽管我们对于我们在Word文档中创建的字段提供了一个名字,我们还是要用数字下标来访问每个字段。这也解释了为什么我们要使用专用的功能(setupfields)做表单字段的字段索引和名之间的映射手册


学习如何在word文档中插入字段(点击这里查看一个定制好的版本),请参阅相关 Word 帮助主题和手册。对于这个demo,我们有一个具备5个MERGEFIELD字段的文档。此外,我们将文档和PHP脚本放在一个目录下,以方便获取。

请注意,printdate字段并没有一个相应的窗体字段。这就是为什么我们要在$inputs数组中添加一个假的printdate作为key。没有这个key,脚本依然可以执行,但是会有提示说明$inputs数组中不存在索引printdate。

在使用表单数据更新完字段的值之后,我们将会使用下面的命令打印文档:
 

$d->PrintOut();

PrintOut方法有几个可选参数,这里,我们使用最简单的格式。这将会给链接到我们Windows机器的默认打印机打印一份副本。


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

在退出word应用程序之前,我们还需要稍作等待,因为打印工作需要时间来完全退出后台。如果没有delay(3),$w->Quit将会立刻得到执行,并且打印工作立刻被终止。

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

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

201573144442664.png (889×757)

201573144502426.png (1663×843)

提高编码速度并更好的理解PIA

PHP是一种弱类型的语言。一个COM对象是一种Object类型。在我们的PHP编码过程中,在一个对象中我们无法使用代码自动提示和完成功能,在一个Word应用,一个文档甚至一个字段中同样如此。我们不知道它有哪些特性,或者它支持哪些方法。


这将大幅度的降低我们开发的速度。为了使开发更快,首先,我建议我们在c#中开发功能应当迁移至我们的PHP编码。我推荐一款免费的C# IDE 叫做"#develop",你可以在这里下载。相比VS,我更喜欢这一款软件,因为#develop体积更小,更简洁,响应更快。

C#代码迁移至PHP一点也不吓人。先让我展示一些C#的代码:
 

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8e1e96de6732cf0b38c54c8087dec1c1.html