在 Linux 中使用 PHP 创建 Word 文档 [关闭]
Posted
技术标签:
【中文标题】在 Linux 中使用 PHP 创建 Word 文档 [关闭]【英文标题】:Create Word Document using PHP in Linux [closed] 【发布时间】:2010-09-12 14:28:19 【问题描述】:php在linux环境下创建word文档有哪些可用的解决方案?
【问题讨论】:
【参考方案1】:真实的 Word 文档
如果您需要生成“真实”的 Word 文档,您需要基于 Windows 的 Web 服务器和 COM 自动化。我强烈推荐Joel's article 这个主题。
fake 欺骗 Word 打开原始 html 的 HTTP 标头
一个相当常见(但不可靠)的替代方案是:
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
标头并不构成真正的文件格式转换。
【讨论】:
这种方法的问题是我不能在我的文档中嵌入图表。 如果您需要制作“真正的”Word 文档,您需要一个基于 Windows 的 Web 服务器。我强烈推荐 Joel 关于这个主题的文章:joelonsoftware.com/items/2008/02/19.html 对于上述技术的更详细解释,请查看这篇文章 - codeproject.com/kb/office/Wordyna.aspx 如果你想使用上述方法并且有一些难以处理的 div (对我来说是基于 CSS 的条形图)你可以使用此代码生成 div 的屏幕截图,将其上传到服务器,并修改您的 html 以包含该图像 - kubilayerdogan.net/?p=304 这击败了文档创建者,或者不得不使用内部函数来格式化页面。【参考方案2】:PHPWord可以生成docx格式的Word文档。它还可以使用现有的 .docx 文件作为模板 - 模板变量可以以 $varname
格式添加到文档中它有一个 LGPL 许可证,代码附带的示例对我来说效果很好。
【讨论】:
这就是答案 :) 同一个地方有用于生成 Excel 和 PowerPoint 文档的库。 同意 - 这是正确答案。 我在 GitHub 中找到了 PHPWord 和 PHPOffice 的更新链接。【参考方案3】:OpenOffice 模板 + OOo 命令行界面。
-
手动创建带有占位符的 ODT 模板,例如 [%value-to-replace%]
在 PHP 中使用真实数据实例化模板时,解压缩模板 ODT(它是一个压缩的 XML),然后针对 XML 运行用实际值替换占位符的文本。
把 ODT 拉回来
通过 OpenOffice 命令行界面运行转换 ODT -> DOC。
有一些工具和库可用于简化每个步骤。
可能会有帮助。
【讨论】:
您能分享您使用哪些库,或者认为哪些库适合这些任务? tinybutstrong.com/plugins/opentbs/tbs_plugin_opentbs.html【参考方案4】:到目前为止,使用 PHP 在 Linux 上创建 DOC 文件的最简单方法是使用 Zend 框架组件 phpLiveDocx。
来自项目网站:
"phpLiveDocx 允许开发人员通过将来自 PHP 的结构化数据与在文字处理器中创建的模板相结合来生成文档。生成的文档可以保存为 PDF、DOCX、DOC 或 RTF 文件。概念与邮件合并。”
【讨论】:
似乎需要注册第 3 方服务才能进行繁重的 API 访问。 不是组件,而是网络服务,phpdocx.com/features 可能更好?【参考方案5】:OpenTBS 可以使用模板技术在 PHP 中创建 DOCX 动态文档。
无需临时文件,无需命令行,全部在 PHP 中。
它可以添加或删除图片。创建的文档可以生成为 HTML 下载文件、保存在服务器上的文件或 PHP 中的二进制内容。
它还可以合并 OpenDocument 文件(ODT、ODS、ODF、...)
http://www.tinybutstrong.com/opentbs.php
【讨论】:
【参考方案6】:根据 Ivan Krechetov 的回答,这里有一个函数可以为 docx 和 odt 进行邮件合并(实际上只是简单的文本替换),而不需要额外的库。
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;
这将取代 [人名] 与米娜 和 Mooo 的 [Person Last Name]:
$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);
请注意,如果要替换的字符串太笼统,此函数可能会损坏文档。尝试使用 [Person Name] 之类的详细替换字符串。
【讨论】:
很好的解决方案。请注意, tempnam_sfx 函数不是标准 PHP,您需要从例如添加它。 ***.com/a/37515697/957841。我还修复了示例中的一个错误。【参考方案7】:Apache 项目有一个名为 POI 的库,可用于生成 MS Office 文件。它是一个 Java 库,但优点是它可以毫无问题地在 Linux 上运行。这个库有其局限性,但它可能会为您完成这项工作,而且使用起来可能比尝试运行 Word 更简单。
另一个选择是 OpenOffice,但我不能完全推荐它,因为我从未使用过它。
【讨论】:
【参考方案8】:<?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);
?>
【讨论】:
COM 仅适用于 Windows。另外,服务器必须安装 MS Word。【参考方案9】:有 2 个选项可以创建高质量的 Word 文档。使用 COM 与 word 通信(这至少需要一个 windows php 服务器)。使用 openoffice 及其 API 以 word 格式创建和保存文档。
【讨论】:
【参考方案10】:看看 PHP COM 文档(cmets 很有帮助)http://us3.php.net/com
【讨论】:
以上是关于在 Linux 中使用 PHP 创建 Word 文档 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章