Как приручить генерацию документов в PHP с помощью PHPWord
Когда-нибудь пробовали собрать Word-файл вручную, просто склеивая строки? Если да, то вы знаете, что формат .docx — это на самом деле упакованный в ZIP-архив набор XML-файлов. Пытаться генерировать его «на коленке» без специальных инструментов — верный способ провести бессонную ночь, сражаясь со спецификациями Microsoft Open XML. А задача-то житейская: сформировать договор из шаблона, выгрузить отчет с графиками или подготовить красивый счет для клиента.
Для таких случаев в PHP-мире давно существует PHPWord. Это часть семейства PHPOffice, куда входят и другие полезные штуки вроде PHPExcel (ныне PhpSpreadsheet). Несмотря на то что проекту больше десяти лет, он остается стандартом де-факто для работы с текстовыми документами.
Что за зверь такой
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
Где это использовать на практике
- Генерация договоров. Пользователь заполняет анкету на сайте, нажимает кнопку и получает готовый PDF или Word с подставленными реквизитами.
- Экспорт аналитики. Еженедельный отчет для руководства с таблицами продаж и красивыми графиками роста.
- Автоматизация документооборота. Создание актов, счетов-фактур и прочих формализованных бумаг в корпоративных системах.
Кому пригодится
PHPWord точно стоит попробовать, если вашему проекту не хватает функционала «скачать в Word». Да, библиотека не идеальна — у нее довольно много открытых issue на GitHub, а документация местами заставляет лезть в исходники. Однако более зрелого и мощного инструмента для PHP в этой нише просто не существует.
Если ваша задача — простая вставка данных в готовый бланк, используйте TemplateProcessor. Если же нужно генерировать сложные документы с динамической структурой с нуля — приготовьтесь потратить время на изучение объектной модели стилей. В любом случае, это в разы лучше, чем пытаться собрать XML-структуру вручную.
