Для создания документа .docx на основании шаблона с динамическими данными из инфоблока bitrix используем библиотеку PHPWord:

  1. Скачать библиотеку: https://github.com/PHPOffice/PHPWord.

  2. Поместить папку \src\PhpWord в нужный раздел, в котором будет использоваться библиотека.

  3. Переместить файл PHPWord.php из папки \PhpWord в раздел, в котором будет использоваться библиотека.

  4. Закомментировать следующие строки в файле \PHPWord\Template.php для возможности использовать автозамену:

    public function setValue($search, $replace) {
    if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
    $search = '${'.$search.'}';
    }

    if(!is_array($replace)) {
    $replace = utf8_encode($replace);
    }

    $this->_documentXML = str_replace($search, $replace, $this->_documentXML);
    }
  5. Добавить в файл следующие строки:

    public function setValue($search, $replace) {
    if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
    //было - $search = '${'.$search.'}';
    $search = '/\$\{.*?'.$search.'.*?\}/is';
    }

    if(!is_array($replace)) {
    //$replace = utf8_encode($replace);
    }

    $this->_documentXML = preg_replace($search, $replace, $this->_documentXML);
    }
  6. Создать шаблон документа .docx с метками в тексте документа типа ${имя_переменной}, например ${number}.

  7. Подключить библиотеку в файле:

    include_once 'PHPWord.php'; //подключение библиотеки
    $word = new PHPWord(); //создание документа
    $document = $word->loadTemplate('act_template.docx'); //загрузка шаблона документа
    $document->setValue('number', $number_param); //заполнение метки значением
    $document->setValue('year', $year_param);
    $document->save('file_act_'.$number_param.'.docx'); //сохранение файла в файловой системе bitrix

    Библиотека располагает большим количеством методов для изменения свойств документа, форматирования текста, разделов документа, добавления изображений, таблиц, списков и др.

    Таким образом, мы можем создать .docx файл на основе шаблона с динамическим содержимым из инфоблока bitrix.