Работа с phpWord. Заполнение шаблона договора docx

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

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

Начну с постановки задачи. А она довольно простая — работая над сайтом клиента по прокату автомобилей возникла необходимость несколько автоматизировать рутинные операции. В частности требовалось при оформлении аренды на сайте автоматически заполнять в договоре некоторые поля. Вот этим и займемся.

Для работы нам потребуется замечательная библиотека phpWord. Она имеет огромное количество возможностей, мы же рассмотрим ее способность заполнять готовые шаблоны документов.

Итак, мы скачали phpWord, распаковали архив и залили на веб-сервер. В моем случае речь идет о версии 0.6.2 Beta.

phpWord заливка на сервер

phpWord заливка на сервер

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

Пример договора-шаблона

Пример договора-шаблона

Давайте определимся, что в этом шаблоне мы поручим заполнять php скрипту. К примеру, пусть это будет номер договора с датой, а также ФИО продавца и номер паспорта. Теперь давайте превратим наш договор в шаблон, с которым будем работать дальше.

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

Данные Переменная
Номер договора d_num
Дата договора  d_date
Фамилия  last_name
 Имя  name
 Отчество  surname

Замечательно. Теперь делаем следующее — на тех местах, где у нас данные, мы их удаляем и вставляем имена переменных в виде

${variable}

Т. е. там, где у нас номер договора 123 мы пишем ${d_num} и т. д. для всех переменных. В итоге получится вот такой шаблон договора:

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

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

Сохранение шаблона

Сохранение шаблона

Отнеситесь к этому внимательно — ошибок допускать нельзя. Сохраняем полученный шаблон под именем Template.docx (можно назвать по своему).

Внимание! При сохранении документа в Word 2010 поставьте чекбокс «Поддерживать совместимость с предыдущими версиями Word» иначе работать не будет.

 

Вот теперь наш шаблон готов, теперь давайте научим php заполнять его.

Создаем php файл (к примеру, index.php) со следующим содержимым:


require_once 'PHPWord.php';
$PHPWord = new PHPWord();
$document = $PHPWord->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'); //имя заполненного шаблона для сохранения

Вот и все. Если теперь мы запустим выполним наш скрипт, то в итоге получим заполненный данными шаблон договора:

Заполненный шаблон

Заполненный шаблон

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

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

Меток нет. Похожие записи
Запись опубликована в рубрике PHP. Добавьте в закладки постоянную ссылку.

8 комментариев: Работа с phpWord. Заполнение шаблона договора docx

  1. Валентина говорит:

    Спасибо за статью! Много прочитала, но помогла именно ваша :)
    А как быть, чтобы отдать полученный документ на скачивание, а не сохранять на жесткий диск?
    Я делаю:

    $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');

    Отдает битый пустой файл

    • alzn говорит:

      У меня тоже PHP Word на выходе отдает какой-то битый файл, который не открывается в Word. При этом файл не пустой, но почему-то имеет неверный формат. При просмотре файла в Editre- в нем полно всякой ерунды, включая заголовки сайта, меню, куки php. Не знаете в чем проблема? Почему библиотека phpword не работает как надо?

    • Алтуха говорит:

      метод saveAs() надо вызвать, тока тогда сохранит изменения

  2. Александр говорит:

    А как вообще эту библиотеку прикрутить к тому же денверу, сказано скиньте в ваш вебсервер, куда уже только не кидал не видит он её. кидал home\домен\www\ кидал так же home\licalhost\

  3. Виталий говорит:

    А процедурным стилем как вносить данные в документ?

  4. денис говорит:

    Не работает ваш пример.

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

  5. Илья говорит:

    Общее замечание. Статья относится к библиотеке 2011 года PHPWord. Она была такая, и исходники есть, и всё так. На гитхабе сейчас лежит её далёкий потомок PhpWord. В нём изменено очень много чего (например, не надо кривить исходники ради корректной работы с русским языком). И, в частности, пример выглядит радикально по-другому:


    require_once('vendor/autoload.php'); // ставится ТОЛЬКО через Composer!
    $_doc = new \PhpOffice\PhpWord\TemplateProcessor('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

Добавить комментарий для Александр Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>