Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux中使用PHP创建Word文档_Php_Linux_Ms Word_Document - Fatal编程技术网

在Linux中使用PHP创建Word文档

在Linux中使用PHP创建Word文档,php,linux,ms-word,document,Php,Linux,Ms Word,Document,PHP在linux环境中创建word文档的可用解决方案是什么?real word文档 如果您需要生成“真实”Word文档,则需要基于Windows的web服务器和COM自动化。关于这个问题,我极力推荐 伪造HTTP头,用于诱骗Word打开原始HTML 一个相当常见(但不可靠)的替代方案是: header("Content-type: application/vnd.ms-word"); header("Content-Disposition: attachment; filename=docum

PHP在linux环境中创建word文档的可用解决方案是什么?

real word文档 如果您需要生成“真实”Word文档,则需要基于Windows的web服务器和COM自动化。关于这个问题,我极力推荐

伪造HTTP头,用于诱骗Word打开原始HTML 一个相当常见(但不可靠)的替代方案是:

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>"
标题(“内容类型:application/vnd.ms word”);
标题(“内容处置:附件;文件名=文档_name.doc”);
回声“;
回声“;
回声“;
呼应“假字文件”;
回声“;
回声“”
确保不使用外部样式表。所有内容都应该在同一个文件中


请注意,这不会发送实际的Word文档。它只是欺骗浏览器将其作为下载提供,并默认为
.doc
文件扩展名。旧版本的Word通常会在没有任何警告/安全消息的情况下打开此文件,并将原始HTML导入Word。PHP发送误导性的
内容类型
标题并不构成真正的文件格式转换。

创建高质量word文档有两个选项。使用COM与word通信(这至少需要windows php服务器)。使用openoffice及其API以word格式创建和保存文档。

Apache项目有一个名为的库,可用于生成MS Office文件。它是一个Java库,但优点是它可以在Linux上运行而不会遇到任何问题。这个库有它的局限性,但它可以为您完成这项工作,而且它可能比运行Word更简单


另一个选项是OpenOffice,但我不能确切地推荐它,因为我从未使用过它。

OpenOffice模板+OOo命令行界面

  • 手动创建带有占位符的ODT模板,如[%value to replace%]
  • 在PHP中用真实数据实例化模板时,解压缩模板ODT(它是一个压缩的XML),并针对XML运行占位符的文本替换,以实际值替换占位符
  • 把ODT拉回来
  • 通过OpenOffice命令行界面运行转换ODT->DOC
  • 有一些工具和库可以简化这些步骤


    这可能会有所帮助。

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

    从项目网站:

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


    根据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的[个人姓氏]:

    $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]。

    查看PHP COM文档(注释很有用)

    可以使用模板技术在PHP中创建DOCX动态文档

    无需临时文件,无需命令行,全部用PHP编写

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

    它还可以合并OpenDocument文件(ODT、ODS、ODF等)

    可以生成docx格式的Word文档。它还可以使用现有的.docx文件作为模板-模板变量可以以${varname}格式添加到文档中


    它有一个LGPL许可证,代码附带的示例对我来说效果很好。

    这种方法的问题是我无法在文档中嵌入图形。如果需要生成“真实”Word文档,则需要基于Windows的web服务器。我强烈推荐Joel关于这个主题的文章:要更详细地解释上面提到的技术,请查看这篇文章-如果你想使用上面提到的技术,并且有一些难以处理的div(对我来说,这是一个基于CSS的条形图),你可以使用这段代码生成div的屏幕截图,将其上传到服务器,并修改html以包含该图像-这比文档创建者或必须使用内部函数格式化页面要好。似乎需要注册第三方API访问服务来完成繁重的工作。不是组件而是web服务,也许更好?您可以共享您使用的库吗,或者认为您适合这些任务?答案是:)同一个地方有用于生成Excel和PowerPoint文档的库。同意-这是正确的答案。我发现GitHub.COM中的更新链接仅适用于Windows。另外,服务器必须安装MS Word。这是一个很好的解决方案。请注意,tempnam_sfx函数不是标准的PHP,您需要从例如添加它。我还修复了示例中的一个错误。
    $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);
    }