Библиотека PHPWord, находящаяся уже почти год в стадии бета-тестирования 1) , предоставляет возможность создания сложных документов формата OOXML (*.docx). Рассмотрим основные возможности этой библиотеки. Для начала работы достаточно распаковать архив с библиотекой в каталог с создаваемым вами документом PHP и подгрузить основной класс библиотеки, расположенный в файле PHPWord.php:
Содержание
Свойства документа и шрифт по-умолчанию
Создание документа начинается с объявления экземпляра класса PHPWord. Конструктор не требует передачи аргументов:
Далее следует задать название и размер шрифта по-умолчанию:
В рассматриваемой версии до применения указанных выше функций шрифтом по-умолчанию является Arial размером 20 пунктов. Теперь можно задать время создания документа, имя автора и так далее:
По-умолчанию в качестве даты создания и изменения документа указывается текущее время, а остальные свойства заполняются пустыми значениями. Если требуется указать конкретную дату создания или изменения, используйте функцию mktime или любую другую функцию, возвращающую время в стиле Unix.
Создание разделов
Основным элементом документа Word является Раздел. Раздел представляет собой прямоугольную область, внутри которой помещаются остальные элементы страницы: текст, изображения, таблицы и т.д.
Раздел может иметь книжную или альбомную ориентацию, настраиваемые поля (margins), настраиваемые цвета границ раздела и их толщину (на рисунке показана пунктиром):
| Параметр | Описание |
|---|---|
| orientation | Ориентация страницы: null — книжная ориентация, landscape — альбомная |
| marginTop | Размер верхнего поля во внутренних единицах |
| marginRight | Размер правого поля во внутренних единицах |
| marginBottom | Размер нижнего поля во внутренних единицах |
| marginLeft | Размер левого поля во внутренних единицах |
| borderTopSize | Толщина верхнего края рамки во внутренних единицах |
| borderRightSize | Толщина правого края рамки во внутренних единицах |
| borderBottomSize | Толщина нижнего края рамки во внутренних единицах |
| borderLeftSize | Толщина левого края рамки во внутренних единицах |
| borderTopColor | Цвет верхнего края рамки в шестнадцатеричном формате |
| borderRightColor | Цвет правого края рамки в шестнадцатеричном формате |
| borderBottomColor | Цвет нижнего края рамки в шестнадцатеричном формате |
| borderLeftColor | Цвет левого края рамки в шестнадцатеричном формате |
Для создания раздела существует функция createSection. В качестве внутренних единиц используются типографские твипы. Если вам непривычно указывать размеры в твипах, можно написать простую функцию, преобразующую миллиметры в твипы:
Указанные в таблице параметры могут быть переданы в виде массива при создании раздела.
. или могут быть установлены по-отдельности после создания раздела:
Добавление текста
Добавление блока текста
Под блоком текста понимается отрывок текста, имеющий одинаковое форматирование (цвет, размер шрифта и т.п.). Для создания блока текста в выбранном разделе используйте функцию addText:
Здесь $text — добавляемый текст, необязательный параметр $fontStyle — имя определенного ранее текстового стиля, необязательный параметр $paragraphStyle — имя определенного ранее стиля абзаца.
Изменение форматирования текста
Форматирование текста, как и форматирование раздела, может осуществляться при его создании.
. или устанавливается после создания предназначенными для этого методами:
Ниже приведен полный список доступных параметров форматирования текста:
| Параметр | Описание |
|---|---|
| size | Размер шрифта в типографских пунктах |
| name | Название шрифта (кегль) |
| bold | Является ли текст полужирным (truefalse) |
| italic | Выделен ли текст курсивом (truefalse) |
| superScript | Является ли текст надстрочным (truefalse) |
| subScript | Является ли текст подстрочным (truefalse) |
| underline | Вид подчеркивания 2) из набора констант PHPWord_Style_Font: UNDERLINE_NONE — нет подчеркивания, UNDERLINE_DASHHEAVY — жирная штриховая линия, UNDERLINE_DASHLONG — удлиненная штриховая линия, UNDERLINE_DASHLONGHEAVY — удлиненная жирная штриховая линия, UNDERLINE_DOUBLE — двойная линия, UNDERLINE_DOTHASH 3) — штрих-пунктир, UNDERLINE_DOTHASHHEAVY — жирный штрих-пунктир, UNDERLINE_DOTDOTDASH — две точки + тире, UNDERLINE_DOTDOTDASHHEAVY — жирные две точки + тире, UNDERLINE_DOTTED — пунктир, UNDERLINE_DOTTEDHEAVY — жирный пунктир, UNDERLINE_SINGLE — одинарная линия, UNDERLINE_WAVY — волнистая линия, UNDERLINE_WAVYDOUBLE — двойная волнистая линия, UNDERLINE_WAVYHEAVY — тройная волнистая линия, UNDERLINE_WORDS — подчеркивать только слова (не подчеркивать пробелы) |
| Color | Цвет шрифта в шестнадцатеричном формате |
| fgColor | Цвет выделения маркером из набора констант PHPWord_Style_Font: FGCOLOR_YELLOW — желтый, FGCOLOR_LIGHTGREEN — ярко-зеленый, FGCOLOR_CYAN — бирюзовый, FGCOLOR_MAGENTA — лиловый, FGCOLOR_BLUE — синий, FGCOLOR_RED — красный, FGCOLOR_DARKBLUE — темно-синий, FGCOLOR_DARKCYAN — сине-зеленый, FGCOLOR_DARKGREEN — темно-зеленый, FGCOLOR_DARKMAGENTA — фиолетовый, FGCOLOR_DARKRED — темно-красный, FGCOLOR_DARKYELLOW — коричнево-зеленый, FGCOLOR_DARKGRAY — серый 50%, FGCOLOR_LIGHTGRAY — серый 25%, FGCOLOR_BLACK — черный |
Названия параметров должны употребляться с соблюдением регистра. В случае параметров underline и fgColor применение значений, не указанных в таблице, не допускается.
Cписок доступных параметров форматирования абзаца:
| Параметр | Описание |
|---|---|
| align | Выравнивание текста в абзаце: left — по левому краю, right — по правому краю, center — по центру, both или justify — по ширине |
| spaceBefore | Отступ абзаца сверху в твипсах |
| spaceAfter | Отступ абзаца снизу в твипсах |
| spacing | Интервал между строк в твипсах |
Определение стилей текста и абзаца
Вместо того, чтобы каждый раз передавать в функцию createText массив с параметрами, вы можете создать именованный стиль, а затем указывать только название этого стиля:
Здесь $styleName — заданное вами имя стиля, $fontStyle — массив, содержащий определение стиля. После создания стиля его имя можно использовать при создании блоков текста, например:
Аналогичным образом осуществляется создание стиля абзаца:
Группировка блоков текста в абзац
Блоки текста с различным форматированием могут быть объединены в абзац заданного вида. Для этого применяется команда createTextRun:
Необязательный параметр $paragraphStyle — массив со стилем абзаца или название созданного ранее именованного стиля.
Добавление заголовков
В библиотеке имеются отдельные функции для добавления заголовков (addTitle) и задания их стилей (addTitleStyle). Применение заголовков вместо форматированных блоков текста необходимо в том случае, если вы хотите добавить в документ автоматически создаваемое оглавление, поскольку в оглавление включаются только заголовки, а не обычные блоки текста. При добавлении заголовков создание стилей заголовков обязательно:
Здесь $titleLevel — уровень заголовка, для которого задается стиль (обычно от 1 до 6), $fontStyle — массив со стилем форматирования заголовка, $paragraphStyle — массив со стилем форматирования абзаца. Как видите, форматирование можно не трогать, но сам стиль заголовка требуемого уровня должен быть обязательно создан. Добавление заголовка делается так:
По-умолчанию создается заголовок 1 уровня.
Добавление ссылок
Добавление ссылок мало чем отличается от добавления обычного текста. Для добавления ссылки используется команда:
Разрыв строки и страницы
Для принудительного переноса строки используйте синтаксис:
Необязательный параметр $num, по-умолчанию равный 1, указывает сколько переносов строки необходимо сделать. Для принудительной вставки разрыва страницы выполните:
Добавление оглавления
Для добавления оглавления используется функция addTOC:
Здесь $fontStyle — форматирование текста, определенное одним из ранее указанных способов, $tocStyle — массив со стилем оформления оглавления, возможные параметры которого приведены в таблице: ^ Параметр ^ Описание ^
| tabLeader | Заполнитель между заголовком и номером страницы из набора констант PHPWord_Style_TOC : TABLEADER_DOT — точки, TABLEADER_UNDERSCORE — символ подчеркивания, TABLEADER_LINE — линия, TABLEADER_NONE — нет заполнителя |
| tabPos | Положение номера страницы в твипсах |
| Indent | Отступ заголовков в твипсах |
Добавление списков
Присутствует возможность добавления нумерованных и ненумерованных списков в документ. Для добавления элемента списка используйте код:
Здесь $text — текст добавляемого элемента списка, $depth — глубина вложенности элемента в списке (от 1 до 9, по-умолчанию равна 1), $textStyle — форматирование текста списка одним из предложенных ранее способов, $listStyle — форматирование самого списка при помощи массива параметров, $paragraphStyle — форматирование абзаца. На данный момент не существует функции addListStyle, поскольку у списков пока может изменяться только один параметр:
| Параметр | Описание |
|---|---|
| listType | Вид списка из набора констант PHPWord_Style_ListItem: TYPE_NUMBER — одноуровневый нумерованный список, TYPE_NUMBER_NESTED — многоуровневый нумерованный список, TYPE_BULLET_FILLED — ненумерованный список с маркерами в виде закрашенных кругов, TYPE_BULLET_EMPTY — ненумерованный список с маркерами в виде незакрашенных кругов, TYPE_SQUARE_FILLED — ненумерованный список с маркерами в виде закрашенных квадратов |
Добавление таблиц
Важной частью документа Word являются таблицы. Для создания таблицы в PHPWord выполните:
Необязательный аргумент $tableStyle — массив с описанием стиля таблицы или название такового, определенного методом addTableStyle:
Аргументы: $styleName — название стиля, $tableStyle — массив с определением стиля, $firstRowStyle — массив с определением стиля ячеек 1 строки (шапки) таблицы. Ниже приведена таблица возможных стилевых параметров таблицы в целом: ^ Параметр ^ Описание ^
| cellMarginTop | Отступ от ячейки сверху в твипсах |
| cellMarginRight | Отступ от ячейки справа в твипсах |
| cellMarginBottom | Отступ от ячейки снизу в твипсах |
| cellMarginLeft | Отступ от ячейки слева в твипсах |
Теперь в созданную таблицу можно добавить ячейки. Как и в XHTML, вначале нужно создать строку.
. затем добавить ячейки и заполнить их форматированным текстом.
. или сделать то же самое одной командой.
. или вместо простого текста добавить изображения, списки ссылки одной из следующих команд:
| Команда | Действие |
|---|---|
| addText | Добавить форматированный текст |
| addTextBreak | Добавить перенос строки |
| addLink | Добавить ссылку |
| addListItem | Добавить элемент списка |
| addImage | Добавить изображение из файла |
| addMemoryImage | Добавить динамически сгенерированное изображение |
| addObject | Добавить объект OLE |
| addPreserveText | Добавить поле (например, нумерацию страниц) |
Как вы уже, наверное, догадались, параметр $rowHeight — позволяет задать высоту в твипсах создаваемой строки, $cellWidth — ширину ячейки (столбца), а $cellStyle — изменить форматирование ячейки. При форматировании ячейки поддерживаются следующие параметры:
| Параметр | Описание |
|---|---|
| valign | Выравнивание в ячейке по-вертикали: both — по-вертикали по ширине, top — по верхнему краю, bottom — по нижнему краю, center — по-центру |
| textDirection | Направление текста из набора констант PHPWord_Style_Cell: TEXT_DIR_BTLR — развернут на 90 градусов против часовой стрелки, TEXT_DIR_TBRL — развернут на 90 градусов по часовой стрелке |
| bgColor | Цвет фона ячейки в шестнадцатеричном формате |
| borderTopSize | Толщина верхней границы ячейки в твипсах |
| borderRightSize | Толщина правой границы ячейки в твипсах |
| borderBottomSize | Толщина нижней границы ячейки в твипсах |
| borderLeftSize | Толщина левой границы ячейки в твипсах |
| borderTopColor | Цвет верхней границы ячейки в шестнадцатеричном формате |
| borderRightColor | Цвет правой границы ячейки в шестнадцатеричном формате |
| borderBottomColor | Цвет нижней границы ячейки в шестнадцатеричном формате |
| borderLeftColor | Цвет левой границы ячейки в шестнадцатеричном формате |
Добавление изображений
PHPWord позволяет добавлять в создаваемый документ изображения 2 типов: из файла (метод addImage) и динамически сгенерированное сценарием изображение (метод addMemoryImage). Поддерживаются файлы форматов jpg, png, gif, tiff, bmp. Примеры применения методов:
Здесь $src и $url — соответственно путь к файлу и абсолютный путь к сценарию (с адресом сайта и промежуточных каталогов), $imageStyle — массив с форматированием изображения. Поддерживаемые параметры форматирования:
| Параметр | Описание |
|---|---|
| width | Требуемая ширина изображения в пикселях |
| height | Требуемая высота изображения в пикселях |
| align | Горизонтальное выравнивание изображения: left — по левому краю, right — по правому краю, center — по центру |
Если требуемые размеры изображения не указаны — библиотека пытается определить фактические размеры изображения при помощи функции [php>getimagesize|getimagesize]].
Добавление объектов OLE
С помощью метода addObject вы можете внедрить в создаваемый документ фрагмент другого документа (*.docx, *.xlsx, *.pptx) при помощи технологии OLE:
Массив $objectStyle может содержать только один параметр:
| Параметр | Описание |
|---|---|
| align | Выравнивание объекта по-горизонтали: left — по левому краю, right — по правому краю, center — по центру |
Колонтитулы
Каждый раздел документа может иметь свой верхний (header) и нижний (footer) колонтитул, отображаемый на всех принадлежащих ему страницах. С точки зрения Word колонтитул является особым видом раздела, поэтому к колонтитулу применимо большинство описанных выше методов: addText, createTextRun, addTextBreak, addImage, addMemoryImage, addListItem, addTable. Кроме этого колонтитул имеет собственный метод addPreserveText, позволяющий создавать нумерацию страниц. Пример создания верхнего (createHeader) и нижнего (createFooter) колонтитула:
Как и всегда форматирование текста колонтитула и абзаца являются необязательными параметрами.
Использование шаблонов
Библиотека PHPWord поддерживает еще один интересный метод создания документов Word — использование шаблонов. Подробный принцип работы при генерировании документов из шаблонов описан в статье docx-templates. В качестве метки в PHPWord используется комбинация $ , где NAME — имя метки. Пример генерирования с использованием меток:
Сохранение файла
Для сохранения файла на жесткий диск или вывода его для скачивания пользователю используется метод save класса PHPWord_Writer_Word2007. В качестве единственного аргумента метода указывается строка ‘php://output’, если требуется вывести документ для скачивания пользователем или имя файла, если документ нужно сохранить на жесткий диск. При выводе файла для скачивания не забудьте отправить браузеру пользователя соответствующие заголовки:
Сохранение файла на жесткий диск:
Пример
Подытоживая все вышесказанное хочется привести пример, в котором проиллюстрировано применение большинства возможностей библиотеки PHPWord:
Данный пример в работе можно посмотреть по этой ссылке. В заключение хотелось бы отметить, что для сайтов, где структура docx-файла слабо 4) зависит от входных данных, рекомендуемым способом стоит считать docx-templates, поскольку:

Шаблон договора для phpWord
Начну с постановки задачи. А она довольно простая — работая над сайтом клиента по прокату автомобилей возникла необходимость несколько автоматизировать рутинные операции. В частности требовалось при оформлении аренды на сайте автоматически заполнять в договоре некоторые поля. Вот этим и займемся.
Для работы нам потребуется замечательная библиотека phpWord. Она имеет огромное количество возможностей, мы же рассмотрим ее способность заполнять готовые шаблоны документов.
Итак, мы скачали phpWord, распаковали архив и залили на веб-сервер. В моем случае речь идет о версии 0.6.2 Beta.

phpWord заливка на сервер
Теперь нам необходимо подготовить сам шаблон. Для этого запускаем MS Word или даже Wordpad и набираем текст договора. Для примера я набросал тестовый договор, который выглядит вот так (кликабельно):

Давайте определимся, что в этом шаблоне мы поручим заполнять php скрипту. К примеру, пусть это будет номер договора с датой, а также ФИО продавца и номер паспорта. Теперь давайте превратим наш договор в шаблон, с которым будем работать дальше.
Итак, для заполнения мы определили данные, давайте подберем для них имена. Это может быть транслитерация или английское написание, вы можете выбрать по вкусу.
| Данные | Переменная |
| Номер договора | d_num |
| Дата договора | d_date |
| Фамилия | last_name |
| Имя | name |
| Отчество | surname |
Замечательно. Теперь делаем следующее — на тех местах, где у нас данные, мы их удаляем и вставляем имена переменных в виде
Т. е. там, где у нас номер договора 123 мы пишем $ и т. д. для всех переменных. В итоге получится вот такой шаблон договора:

Шаблон договора для phpWord

Отнеситесь к этому внимательно — ошибок допускать нельзя. Сохраняем полученный шаблон под именем Template.docx (можно назвать по своему).
Внимание! При сохранении документа в Word 2010 поставьте чекбокс «Поддерживать совместимость с предыдущими версиями Word» иначе работать не будет.
Вот теперь наш шаблон готов, теперь давайте научим php заполнять его.
Создаем php файл (к примеру, index.php) со следующим содержимым:
Вот и все. Если теперь мы запустим выполним наш скрипт, то в итоге получим заполненный данными шаблон договора:

Как видно, скрипт успешно заполнил шаблон, вот только с русскими символами беда — они выглядят не так, как задумывалось. Как решить эту проблему читайте в статье.
На этом все. Надеюсь, что хоть немного помог читателю разобраться с заполнением docx файлов на php. Для изучения все материалы можно скачать в виде архива.
Меток нет. Похожие записи
- No related posts.
8 комментариев: Работа с phpWord. Заполнение шаблона договора docx
Спасибо за статью! Много прочитала, но помогла именно ваша
А как быть, чтобы отдать полученный документ на скачивание, а не сохранять на жесткий диск?
Я делаю:
$word = new PHPWord();
header(‘Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document’);
header(‘Content-Disposition: attachment;filename="document.docx"’);
header(‘Cache-Control: max-age=0’);
$template = $word->loadTemplate(dirname(dirname(__file__)) . "/documents/blancAct1.docx");
$template->setValue(‘rrr’, ‘замена’);
$writer = PHPWord_IOFactory::createWriter($template, ‘Word2007’);
$writer->save(‘php://output’);
Отдает битый пустой файл
У меня тоже PHP Word на выходе отдает какой-то битый файл, который не открывается в Word. При этом файл не пустой, но почему-то имеет неверный формат. При просмотре файла в Editre- в нем полно всякой ерунды, включая заголовки сайта, меню, куки php. Не знаете в чем проблема? Почему библиотека phpword не работает как надо?
метод saveAs() надо вызвать, тока тогда сохранит изменения
А как вообще эту библиотеку прикрутить к тому же денверу, сказано скиньте в ваш вебсервер, куда уже только не кидал не видит он её. кидал homeдоменwww кидал так же homelicalhost
А процедурным стилем как вносить данные в документ?
Не работает ваш пример.
скачал ваши исходники вот код index.php
loadTemplate(‘Template.docx’);
$document->setValue(‘d_num’, ’777′);
$document->setValue(‘d_date’, ’04.10.2014′);
$document->setValue(‘last_name’, ‘Никоненко’);
$document->setValue(‘name’, ‘Сергей’);
$document->setValue(‘surname’, ‘Васильевич’);
$document->save(‘Template_full.docx’);
?>
вот эта строка вызывает подозрения require_once ‘PHPWord.php’; вы хотите подключить файл ‘PHPWord.php’ которого нет,среди скачанных файлов, что вообще за бред? зря только время потратил.
А скачать по самой первой ссылке что мешает?
Общее замечание. Статья относится к библиотеке 2011 года PHPWord. Она была такая, и исходники есть, и всё так. На гитхабе сейчас лежит её далёкий потомок PhpWord. В нём изменено очень много чего (например, не надо кривить исходники ради корректной работы с русским языком). И, в частности, пример выглядит радикально по-другому:
require_once(‘vendor/autoload.php’); // ставится ТОЛЬКО через Composer!
$_doc = new PhpOfficePhpWordTemplateProcessor(‘Template.docx’);
$_doc->setValue(‘d_num’, ’10/29-77-Ю’); //номер договора
// вывод непосредственно в браузер
header(‘Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document’);
header(‘Content-Disposition: attachment;filename="dogovor.docx"’);
header(‘Cache-Control: max-age=0’);
$_doc->saveAs(‘php://output’);
die;
Думаю, это замечание (о наличии новой версии либы с новыми вызовами) надо добавить в описание. Кому что удобнее: свежая либа с композером и хреновой горой пхпового мусора, или старая, но с багами, пусть решает сам.
dixi
Дата публикации: 2016-02-25

От автора: не так давно на нашем сайте были опубликованы уроки по работе с таблицами Microsoft Excel средствами языка PHP, которые вызвали значительный интерес у нашей аудитории и поэтому, сегодня я решил показать Вам, как создавать документы Microsoft Word ,формата .docx, используя мощнейшую библиотеку PHPWord.


Актуальную версию библиотеки PHPWord, вы найдете на сервисе GitHub.


Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
На данной странице, приведено краткое описание и инструкция по установке библиотеки. Но данная инструкция очень ограничена и не описывает всех возможностей библиотеки, поэтому, официальную PHPWord документацию, для разработчиков, Вы найдете по ссылке.

Установка PHPWord
Установка PHPWord, может быть выполнена двумя способами. Первый способ – ручной, при котором Вы скачиваете архив с последней актуальной версией PHPWord, далее, выполняете распаковку, копируете файлы в собственный проект и подключаете на соответствующих страницах. То есть достаточно стандартный способ. И второй – так сказать, автоматический способ установки, используя инструмент Composer, который мы будем использовать в данном уроке.
Кстати, Вы, наверное, заметили, что в своих уроках, для установки различных библиотек, я призываю Вас использовать Composer. Так как для простых проектов, в ручную, вполне можно скачивать необходимые элементы, но если мы работаем над более сложным скриптом, то порой затруднительно скачать все необходимые элементы и правильно их установить.
Итак, открываем командную строку и переходим в каталог нашего проекта, используя команду “CD имя папки”.

Далее, используя конструкцию “composer require”, указываем от какой библиотеки “зависит” наш проект и выполняем инструкцию.






