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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
59
0
101 885
10

Ответы 10

настоящие документы 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, не является реальным преобразованием формата файла.

Проблема с этим подходом в том, что я не могу встроить график в свой документ.

TechLearner 24.09.2008 09:46

Если вам нужно создавать «настоящие» документы Word, вам понадобится веб-сервер на базе Windows. Я очень рекомендую статью Джоэла на эту тему: joelonsoftware.com/items/2008/02/19.html

Sergey Kornilov 24.09.2008 16:38

Более подробное объяснение упомянутой выше техники можно найти в этой статье - codeproject.com/kb/office/Wordyna.aspx

mvark 01.02.2011 05:30

Если вы хотите использовать приведенное выше и у вас есть несколько сложных div, с которыми нужно иметь дело (для меня это была столбчатая диаграмма на основе CSS), вы можете использовать этот код для создания снимка экрана div, загрузки его на сервер и изменения вашего html на включить это изображение - kubilayerdogan.net/?p=304

Dave Hilditch 14.07.2013 18:17

это превосходит создателей документов или необходимость использования внутренней функции для форматирования страниц.

unixmiah 18.12.2014 21:24

Как я могу сохранить этот файл в директории моего сервера вместо того, чтобы запрашивать его загрузку?

jackkorbin 27.11.2016 23:09

Есть 2 варианта создания качественных текстовых документов. Используйте COM для связи со словом (для этого требуется как минимум сервер Windows php). Используйте openoffice и его API для создания и сохранения документов в формате Word.

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

Другой вариант - OpenOffice, но я не могу его рекомендовать, так как никогда не использовал его.

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

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

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

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

Не могли бы вы рассказать, какие библиотеки вы используете или считаете, что они подходят для этих задач?

Shade 06.02.2011 22:16

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

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

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

Кажется, требуется регистрация в сторонней службе для доступа к API, которая выполняет тяжелую работу.

garrow 10.06.2009 03:46

не компонент, а веб-сервис, может, лучше phpdocx.com/features?

DaveO 01.09.2011 02:06

<?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.

Stephan Weinhold 23.03.2016 14:42

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

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

Отличное решение. Обратите внимание, что функция tempnam_sfx не является стандартной PHP, вам нужно добавить ее, например, из stackoverflow.com/a/37515697/957841. Я также исправил ошибку в примере.

Arnout 27.03.2017 11:30

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

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

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

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

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

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

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

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

Это ответ :) Там же есть библиотеки для создания документов Excel и PowerPoint.

Chris Baker 10.10.2012 18:37

Согласен - это правильный ответ.

Felix Eve 02.12.2013 16:24

Я нашел обновленную ссылку PHPWord и PHPOffice в GitHub.

j2gl 10.08.2015 06:14

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