Как приручить генерацию документов в PHP с помощью PHPWord

22 мая 2026
7,589
2,736
300
3 недели

Когда-нибудь пробовали собрать Word-файл вручную, просто склеивая строки? Если да, то вы знаете, что формат .docx — это на самом деле упакованный в ZIP-архив набор XML-файлов. Пытаться генерировать его «на коленке» без специальных инструментов — верный способ провести бессонную ночь, сражаясь со спецификациями Microsoft Open XML. А задача-то житейская: сформировать договор из шаблона, выгрузить отчет с графиками или подготовить красивый счет для клиента.

Для таких случаев в PHP-мире давно существует PHPWord. Это часть семейства PHPOffice, куда входят и другие полезные штуки вроде PHPExcel (ныне PhpSpreadsheet). Несмотря на то что проекту больше десяти лет, он остается стандартом де-факто для работы с текстовыми документами.

PHPWord

Что за зверь такой

PHPWord — это библиотека на чистом PHP, которая берет на себя всю грязную работу по чтению и записи документов. Она поддерживает не только привычный .docx, но и OpenDocument (.odt), вездесущий RTF, даже HTML и PDF. Главное достоинство — вам не нужно иметь установленный Microsoft Word на сервере или в системе. Все происходит внутри вашего PHP-кода.

Инструмент пригодится везде, где отчетность выходит за рамки простого вывода текста в браузер. Например, если бухгалтерии нужен именно файл, который можно открыть в Word, поправить пару строк и распечатать.

Реклама

Что умеет библиотека

PHPWord работает по объектно-ориентированной модели. Вы создаете объект документа, добавляете в него секции, а в секции — элементы: текст, таблицы, картинки.

Работа с текстом и стилями

Вы можете задавать стили как угодно: инлайново для конкретного куска текста или создавая именованные стили, которые потом переиспользуются во всем документе. Это похоже на работу с CSS.

$phpWord = new \PhpOffice\PhpWord\PhpWord();
$section = $phpWord->addSection();

// Простой текст
$section->addText('Просто фраза без изысков.');

// Текст со стилем
$section->addText(
    'А это уже серьезный заголовок',
    ['name' => 'Tahoma', 'size' => 16, 'bold' => true]
);

Таблицы любой сложности

Генерация таблиц — одна из самых частых задач. PHPWord справляется с объединением ячеек (rowspan и colspan), настройкой границ, фоновым цветом и повторением шапки на каждой странице. Если данных много, можно просто перебрать массив и заполнить строки в цикле.

Шаблонизатор

Это, пожалуй, моя любимая фича. Вместо того чтобы описывать весь документ кодом (что бывает муторно для больших договоров), вы берете готовый .docx файл, расставляете в нем переменные вида ${user_name} и ${order_date}, а затем просто заменяете их данными из базы.

$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor('template.docx');
$templateProcessor->setValue('user_name', 'Иван Иванов');
$templateProcessor->saveAs('ready_contract.docx');

Это сохраняет форматирование оригинала: шрифты, отступы и логотипы останутся на своих местах.

Картинки и даже графики

Библиотека умеет вставлять изображения (локальные или по ссылке), водяные знаки и даже строить диаграммы прямо внутри документа. Круговые, линейные, гистограммы — если нужно визуализировать данные в отчете, это делается парой методов.

Технический бэкграунд

Проект требует PHP версии 7.1 или выше. Под капотом активно используются расширения XMLWriter и Zip для сборки файлов. Если планируете генерировать PDF, придется подключить стороннюю библиотеку, например dompdf или mPDF — PHPWord использует «транзитный» метод: сначала превращает документ в HTML, а потом просит сторонний движок сделать из него PDF.

Установка стандартная через Composer:

composer require phpoffice/phpword

Где это использовать на практике

  1. Генерация договоров. Пользователь заполняет анкету на сайте, нажимает кнопку и получает готовый PDF или Word с подставленными реквизитами.
  2. Экспорт аналитики. Еженедельный отчет для руководства с таблицами продаж и красивыми графиками роста.
  3. Автоматизация документооборота. Создание актов, счетов-фактур и прочих формализованных бумаг в корпоративных системах.

Кому пригодится

PHPWord точно стоит попробовать, если вашему проекту не хватает функционала «скачать в Word». Да, библиотека не идеальна — у нее довольно много открытых issue на GitHub, а документация местами заставляет лезть в исходники. Однако более зрелого и мощного инструмента для PHP в этой нише просто не существует.

Если ваша задача — простая вставка данных в готовый бланк, используйте TemplateProcessor. Если же нужно генерировать сложные документы с динамической структурой с нуля — приготовьтесь потратить время на изучение объектной модели стилей. В любом случае, это в разы лучше, чем пытаться собрать XML-структуру вручную.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.