





Если вам нужно создавать «настоящие» документы Word, вам понадобится веб-сервер на базе Windows и автоматизация COM. Я очень рекомендую Статья Джоэла по этому поводу.
Довольно распространенная (но ненадежная) альтернатива:
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. Я очень рекомендую статью Джоэла на эту тему: joelonsoftware.com/items/2008/02/19.html
Более подробное объяснение упомянутой выше техники можно найти в этой статье - codeproject.com/kb/office/Wordyna.aspx
Если вы хотите использовать приведенное выше и у вас есть несколько сложных div, с которыми нужно иметь дело (для меня это была столбчатая диаграмма на основе CSS), вы можете использовать этот код для создания снимка экрана div, загрузки его на сервер и изменения вашего html на включить это изображение - kubilayerdogan.net/?p=304
это превосходит создателей документов или необходимость использования внутренней функции для форматирования страниц.
Как я могу сохранить этот файл в директории моего сервера вместо того, чтобы запрашивать его загрузку?
Есть 2 варианта создания качественных текстовых документов. Используйте COM для связи со словом (для этого требуется как минимум сервер Windows php). Используйте openoffice и его API для создания и сохранения документов в формате Word.
В проекте Apache есть библиотека под названием POI, которую можно использовать для создания файлов MS Office. Это библиотека Java, но ее преимущество в том, что она может без проблем работать в Linux. У этой библиотеки есть свои ограничения, но она может сделать эту работу за вас, и ее, вероятно, проще в использовании, чем пытаться запустить Word.
Другой вариант - OpenOffice, но я не могу его рекомендовать, так как никогда не использовал его.
Шаблоны OpenOffice + интерфейс командной строки OOo.
Существуют инструменты и библиотеки, облегчающие выполнение каждого из этих шагов.
Может быть, это поможет.
Не могли бы вы рассказать, какие библиотеки вы используете или считаете, что они подходят для этих задач?
Безусловно, самый простой способ создания файлов DOC в Linux с использованием PHP - это компонент Zend Framework phpLiveDocx.
С веб-сайта проекта:
«phpLiveDocx позволяет разработчикам создавать документы, комбинируя структурированные данные из PHP с шаблоном, созданным в текстовом процессоре. Полученный документ может быть сохранен как файл PDF, DOCX, DOC или RTF. Принцип такой же, как и при слиянии писем. . "
Кажется, требуется регистрация в сторонней службе для доступа к API, которая выполняет тяжелую работу.
не компонент, а веб-сервис, может, лучше phpdocx.com/features?
<?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.
Следуя ответу Ивана Кречетова, вот функция, которая выполняет слияние почты (на самом деле просто замену текста) для 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. Я также исправил ошибку в примере.
Взгляните на документы PHP COM (комментарии полезны) http://us3.php.net/com
OpenTBS может создавать динамические документы DOCX на PHP, используя технику шаблонов.
Никаких временных файлов, никаких командных строк, все на PHP.
Он может добавлять или удалять изображения. Созданный документ может быть создан как загрузка HTML, файл, сохраненный на сервере, или как двоичное содержимое в PHP.
Он также может объединять файлы OpenDocument (ODT, ODS, ODF, ...)
PHPWord может создавать документы Word в формате docx. Он также может использовать существующий файл .docx в качестве шаблона - переменные шаблона могут быть добавлены в документ в формате $ {varname}
У него есть лицензия LGPL, и примеры, прилагаемые к коду, мне очень понравились.
Проблема с этим подходом в том, что я не могу встроить график в свой документ.