在Linux中使用PHP创buildWord文档

什么是可用的PHP解决scheme在linux环境中创buildword文档?

真正的Word文档

如果您需要生成“真实”的Word文档,您需要一个基于Windows的Web服务器和COM自动化。 我强烈build议乔尔关于这个问题的文章 。

假的 HTTP头来欺骗Word打开原始的HTML

一个相当普遍(但不可靠)的select是:

 header("Content-type: application/vnd.ms-word"); header("Content-Disposition: attachment; filename=document_name.doc"); echo "<html>"; echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">"; echo "<body>"; echo "<b>Fake word document</b>"; echo "</body>"; echo "</html>" 

确保你不使用外部样式表。 一切都应该在同一个文件中。

请注意这不会发送一个实际的Word文档。 它只是诱使浏览器提供下载和默认为.doc文件扩展名。 旧版本的Word可能经常打开此没有任何警告/安全消息,只是将原始HTML导入到Word中。 PHP发送错误的Content-Type头并不构成真正的文件格式转换。

PHPWord可以生成docx格式的Word文档。 它也可以使用现有的.docx文件作为模板 – 模板variables可以以$ {varname}格式添加到文档中

它有一个LGPL许可证和代码随附的例子很好地为我工作。

OpenOffice模板+ OOo命令行界面。

  1. 使用占位符手动创buildODT模板,如[%value-to-replace%]
  2. 在PHP中使用真实数据实例化模板时,将模板ODT(它是一个压缩的XML)解压缩,然后针对XML运行带有实际值的占位符的文本replace。
  3. 将ODT拉回
  4. 通过OpenOffice命令行界面运行转换ODT – > DOC。

有可用的工具和库来简化每一个步骤。

可能是帮助。

到目前为止,在Linux上创buildDOC文件的最简单的方法是使用PHP和Zend Framework组件phpLiveDocx

从项目网站:

“phpLiveDocx允许开发人员通过将来自PHP的结构化数据与在文字处理器中创build的模板相结合来生成文档,生成的文档可以保存为PDF,DOCX,DOC或RTF文件,其概念与邮件合并“。

OpenTBS可以使用模板技术在PHP中创buildDOCXdynamic文档。

没有临时文件需要,没有命令行,所有在PHP中。

它可以添加或删除图片。 创build的文档可以作为HTML下载,保存在服务器上的文件,或者作为PHP中的二进制内容来生成。

它也可以合并OpenDocument文件(ODT,ODS,ODF等)

http://www.tinybutstrong.com/opentbs.php

在Ivan Krechetov的回答之后,这里是一个函数,它为docx和odt合并邮件(实际上只是简单的文本replace),而不需要额外的库。

 function mailMerge($templateFile, $newFile, $row) { if (!copy($templateFile, $newFile)) // make a duplicate so we dont overwrite the template return false; // could not duplicate template $zip = new ZipArchive(); if ($zip->open($newFile, ZIPARCHIVE::CHECKCONS) !== TRUE) return false; // probably not a docx file $file = substr($templateFile, -4) == '.odt' ? 'content.xml' : 'word/document.xml'; $data = $zip->getFromName($file); foreach ($row as $key => $value) $data = str_replace($key, $value, $data); $zip->deleteName($file); $zip->addFromString($file, $data); $zip->close(); return true; } 

这将用MOOreplace[Person Name]和Mooo的[Person Last]:

 $replacements = array('[Person Name]' => 'Mina', '[Person Last Name]' => 'Mooo'); $newFile = tempnam_sfx(sys_get_temp_dir(), '.dat'); $templateName = 'personinfo.docx'; if (mailMerge($templateName, $newFile, $replacements)) { header('Content-type: application/msword'); header('Content-Disposition: attachment; filename=' . $templateName); header('Accept-Ranges: bytes'); header('Content-Length: '. filesize($file)); readfile($newFile); unlink($newFile); } 

注意,如果要replace的string太泛,此function可能会损坏文档。 尝试使用详细的replacestring,如[人名]。

Apache项目有一个名为POI的库,可以用来生成MS Office文件。 这是一个Java库,但是它的优势在于它可以在Linux上运行而不会有麻烦。 这个库有其局限性,但它可能会为你做这个工作,而且可能比试图运行Word更简单。

另一个select是OpenOffice,但我不能完全推荐它,因为我从来没有使用它。

 <?php function fWriteFile($sFileName,$sFileContent="No Data",$ROOT) { $word = new COM("word.application") or die("Unable to instantiate Word"); //bring it to front $word->Visible = 1; //open an empty document $word->Documents->Add(); //do some weird stuff $word->Selection->TypeText($sFileContent); $word->Documents[1]->SaveAs($ROOT."/".$sFileName.".doc"); //closing word $word->Quit(); //free the object $word = null; return $sFileName; } ?> <?php $PATH_ROOT=dirname(__FILE__); $Return ="<table>"; $Return .="<tr><td>Row[0]</td></tr>"; $Return .="<tr><td>Row[1]</td></tr>"; $sReturn .="</table>"; fWriteFile("test",$Return,$PATH_ROOT); ?> 

有2个选项可以创build高质量的Word文档。 使用COM与word进行通信(至less需要一个windows php服务器)。 使用openoffice和它的API来创build和保存单词格式的文件。

看看PHP的COM文件(评论是有帮助的) http://us3.php.net/com