Создать документ Word с помощью PHP в Linux

Каковы доступные решения для PHP для создания текстовых документов в среде Linux?

10 ответов

PHPWord может генерировать документы Word в формате docx. Он также может использовать существующий файл.docx в качестве шаблона - переменные шаблона могут быть добавлены в документ в формате ${varname}

У него есть лицензия LGPL, и примеры, прилагаемые к коду, отлично сработали для меня.

реальные документы Word

Если вам нужно создать "настоящие" документы Word, вам нужен веб-сервер на базе Windows и автоматизация 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>"

Убедитесь, что вы не используете внешние таблицы стилей. Все должно быть в одном файле.

Обратите внимание, что это не отправляет фактический документ Word. Он просто обманывает браузеры, предлагая его для загрузки и по умолчанию .doc расширение файла. Старые версии Word могут часто открывать это без каких-либо предупреждений / сообщений безопасности и просто импортировать необработанный HTML-код в Word. PHP отправка отправка, которая вводит в заблуждение Content-Type заголовок вместе не представляет собой реальное преобразование формата файла.

Шаблоны OpenOffice + интерфейс командной строки OOo.

  1. Создайте вручную шаблон ODT с заполнителями, например [%value-to-replace%]
  2. При создании экземпляра шаблона с реальными данными в PHP разархивируйте шаблон ODT (это сжатый XML) и запустите для XML текстовую замену заполнителей фактическими значениями.
  3. Застегните молнию на ОДТ назад
  4. Запустите преобразование ODT -> DOC через интерфейс командной строки OpenOffice.

Для облегчения каждого из этих шагов доступны инструменты и библиотеки.

Может быть, это помогает.

Безусловно, самый простой способ создания файлов DOC в Linux с использованием PHP - это использование компонента Zend Framework phpLiveDocx.

С веб-сайта проекта:

"phpLiveDocx позволяет разработчикам генерировать документы, комбинируя структурированные данные из PHP с шаблоном, созданным в текстовом процессоре. Полученный документ можно сохранить в виде файла PDF, DOCX, DOC или RTF. Концепция такая же, как и с mail-merge ".

OpenTBS может создавать динамические документы DOCX в PHP, используя технику шаблонов.

Не требуется никаких временных файлов, никаких командных строк, все на PHP.

Он может добавлять или удалять картинки. Созданный документ может быть создан в виде загрузки в формате HTML, файла, сохраненного на сервере, или в виде двоичного содержимого в PHP.

Он также может объединять файлы OpenDocument (ODT, ODS, ODF,...)

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

Следуя ответу Ивана Кречетова, вот функция, которая выполняет слияние почты (на самом деле просто простую замену текста) для 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);
}

Помните, что эта функция может повредить документ, если строка для замены является слишком общей. Попробуйте использовать подробные строки замены, такие как [Персона Имя].

Проект Apache имеет библиотеку под названием POI, которую можно использовать для создания файлов MS Office. Это библиотека Java, но преимущество в том, что она может работать на Linux без проблем. Эта библиотека имеет свои ограничения, но она может сделать эту работу за вас, и, вероятно, ее проще использовать, чем пытаться запустить Word.

Другим вариантом будет 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 варианта создания качественных текстовых документов. Используйте COM для общения со словом (для этого требуется, по крайней мере, Windows-сервер php). Используйте openoffice и его API для создания и сохранения документов в текстовом формате.

Посмотрите на документы PHP COM (комментарии полезны) http://us3.php.net/com

Другие вопросы по тегам