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

前端之家收集整理的这篇文章主要介绍了在Windows系统下使用PHP生成Word文档的教程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

准备工作

首先,请确保在你的Windows系统中已经安装并配置好了一个典型的WAMP环境。由于Interop纯粹是一个Windows的特性,我们将在Windows平台下搭建Apache和PHP。在这个实例中,我使用了,这款软件安装和配置都十分容易。

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

我们然后需要去确保开发Interop应用(又被称作PIA,优先交互组件)的库是安装好的。为了确保这个,我们可以打开资源管理器,然后找到\assembly,我们将会看到下面安装好的PIAs分支:

我们可以看到一个 Microsoft.Office.Interop.Word 条目(在这个截图中有下划线)。 这就是我们在这个示例中将要使用的 PIA。请特别注意它的“名称”,“版本”和“公钥标记”。我们将要在PHP脚本中用到它们。

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

如果这个列表没有包含 Microsoft.Office.Interop 的整个包,我们可以重新安装Office并且在安装中包含PIA;我们也可以手动下载安装这个包。安装的详细步骤可以查阅

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

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

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

HTML表单

由于该demo主要关注与后台的处理,所以我们这里就用一个简单的HTML表单做前台的展示,看起来应该是这样的:

我们有一个文本框用于输入“Name”,一个“Gender”的单选按钮组,一个“Age”的域值控制还有一个文本域来写“Message”,最后,还需要一个“Submit”按钮。

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

后台

后台PHP文件是我们所要讨论的核心部分。我先将代码贴到下面,接下来在一步一步的进行解释

PHP;"> $inputs = $_POST;
$inputs['printdate']='';
// A dummy value to avoid a PHP notice as we don't have "printdate" in the POST variables.

$assembly = 'Microsoft.Office.Interop.Word,Version=15.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c';
$class = 'Microsoft.Office.Interop.Word.ApplicationClass';

$w = new DOTNET($assembly,$class);
$w->visible = true;

$fn = DIR . '\template.docx';

$d = $w->Documents->Open($fn);

echo "Document opened.


";

$flds = $d->Fields;
$count = $flds->Count;
echo "There are $count fields in this document.
";
echo "

    ";
    $mapping = setupfields();

    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=='printdate')
    $value= date ('Y-m-d H:i:s');

    $w->Selection->TypeText($value);
    echo "

  • Mappig field $index: $key with value $value
  • ";
    }
    echo "
";

echo "Mapping done!


";
echo "Printing. Please wait...
";

$d->PrintOut();
sleep(3);
echo "Done!";

$w->Quit(false);
$w=null;

function setupfields()
{
$mapping = array();
$mapping[0] = 'gender';
$mapping[1] = 'name';
$mapping[2] = 'age';
$mapping[3] = 'msg';
$mapping[4] = 'printdate';

return $mapping;
}

在设置完用来获取表单中传过来的值的变量$inputs之后,我们要创建一个虚拟值用来存放printdate——我们稍后会讨论为何需要这个变量——现在,我们看到这4行比较关键的代码

代码如下:
String path=Application.StartupPath+"\template.docx";

Word.Document d=w.Documents.Open(path) as Word.Document;

Word.Fields flds=d.Fields;
int len=flds.Count;

foreach (Word.Field f in flds)
{
f.Select();
int i=f.Index;
w.Selection.TypeText("...");
}

我们可以看到,C#的代码和我们之前展示的PHP代码基础一模一样。由于C#是一种强类型语言,所以我们可以看到有些类型转换的语句,我们不得不显性的给我们的变量赋一种类型。

有了代码的类型,我们可以尽情的享受代码自动提示代码自动完成功能,这样我们开发的速度将有大幅度提高。

另一种可以给予我们更快速度进行PHP开发的方式是使用Word的宏命令。我们先操作一遍我们需要重复的动作,然后用一个宏将其录制下来。一个宏其实是Visual Basic,同样也可以非常容易的翻译成PHP

最重要的是,,特别是文档中对于每个Office应用的命名空间,总会是我们所需要的最想进的参考。比较常用的3个应用如下:

  • 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).aspx
  • PowerPoint2013:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v=office.15).aspx

结语

在这篇文章中,我们演示了如何使用PHP COM库和Microsoft Office Interop功能来倩影一个Word文档。

Windows和Office在我们的日常生活中可以说是被广泛的使用。能够知道和了解Office或者Windows的强大之处还有PHP,对于任何一个在Windows平台上进行PHP开发的程序员都是十分必要的。

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

如果你对于这部分的编程比较感兴趣,请留下你的评论,我们将会考虑在这个话题上写更多的文章。我十分期待更多现实生活的应用开发能使用这种方式。

猜你在找的Windows相关文章