首页 > 开发 > PHP > 正文

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

2024-05-04 22:36:11
字体:
来源:转载
供稿:网友

准备工作

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

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

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

201573144223171.png (1050×656)

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

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

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

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

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

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

HTML表单

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

201573144251848.png (889×757)

我们有一个文本框用于输入“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.<br><hr>"; $flds = $d->Fields;$count = $flds->Count;echo "There are $count fields in this document.<br>";echo "<ul>";$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 "<li>Mappig field $index: $key with value $value</li>";}echo "</ul>"; echo "Mapping done!<br><hr>";echo "Printing. Please wait...<br>"; $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;}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表