Файл docx на основе шаблона при помощи PHP
Довольно часто встречается задача автоматизировать заполнение всяческих заявлений..ну например в бухгалтерию. Это вполне можно сделать и на PHP, позволив пользователю на форме веб страницы заполнить основные данные, а затем отдав ему уже сформированный на основе шаблона файл формата docx (файл docx на основе шаблона).
HTML часть может выглядеть примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<div class="rendered-form"> <div class="formbuilder-text form-group field-position_at_work"> <label for="position_at_work" class="formbuilder-text-label">Ваша должность <br> </label> <input type="text" placeholder="Наиглавнейший церемонимейстер" class="form-control" name="position_at_work" access="false" id="position_at_work"> </div> <div class="formbuilder-text form-group field-me_unit"> <label for="me_unit" class="formbuilder-text-label">Подразделение</label> <input type="text" placeholder="Отдел развития и автоматизации" class="form-control" name="me_unit" access="false" id="me_unit"> </div> <div class="formbuilder-text form-group field-me_name"> <label for="me_name" class="formbuilder-text-label">Ваше ФИО <br> </label> <input type="text" placeholder="Иванов Иван Иванович" class="form-control" name="me_name" access="false" id="me_name"> </div> <div class="formbuilder-date form-group field-date_start"> <label for="date_start" class="formbuilder-date-label">Дата начала отпуска <br> </label> <input type="date" class="form-control" name="date_start" access="false" id="date_start"> </div> <div class="formbuilder-number form-group field-long_vacation"> <label for="long_vacation" class="formbuilder-number-label">Продолжительность отпуска <br> </label> <input type="number" class="form-control" name="long_vacation" access="false" value="14" min="1" max="31" id="long_vacation"> </div> <div class="formbuilder-button form-group field-button-1714717346219"> <button onclick="CreateZay()" type="button" class="btn-success btn" name="button-1714717346219" access="false" style="success" id="button-1714717346219">Сформировать заявление <br> </button> </div> </div> |
На странице увидим что-то вроде:
На JavaScript создам функцию — обработчик нажатия на кнопку «Сформировать заявление». Функция делает запрос на сервер, а в ответ получает сформированный файл. Браузер автоматически предложит его сохранить.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function CreateZay(){ console.log("--создаётся заявление.."); var xhr = new XMLHttpRequest(); xhr.open('POST', '/sever/zayav.php', true); xhr.responseType = 'blob'; xhr.onload = function(e) { if (this.status == 200) { var link=document.createElement('a'); link.href=window.URL.createObjectURL(this.response); link.download="result.docx"; link.click(); } else { console.log(e); } }; var form_data = new FormData(); form_data.append("position_at_work", position_at_work.value); form_data.append("me_unit", me_unit.value); form_data.append("me_name", me_name.value); form_data.append("date_start", date_start.value); form_data.append("long_vacation", long_vacation.value); xhr.send(form_data); }; |
С клиентской частью (ну которая в браузере) разобрались. Теперь займемся сервером. Чтобы ничего не изобретать, воспользуемся пакетом phpoffice/phpword:
1 |
composer require phpoffice/phpword |
Далее подготовим файл-шаблон. Можно в любом редакторе, который поддерживает расширение docx. В файле , те части которые мы хотим заменить, обрамляем ${имя_переменноя}, чтобы получилось например что-то вроде:
Далее, серверная часть, которая заполняет непосредственно сам шаблон:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php $dt_start=strtotime($_POST["date_start"]); $dt_end=strtotime($_POST["date_start"]." ".$_POST["long_vacation"]." day"); $newformat_start = date('d.m.Y',$dt_start); $newformat_end = date('d.m.Y',$dt_end); //var_dump($_POST); //die(); require $_SERVER["DOCUMENT_ROOT"].'/sever/phpword/autoload.php'; //создаем класс $phpWord = new \PhpOffice\PhpWord\PhpWord(); $_doc = new \PhpOffice\PhpWord\TemplateProcessor('templates/template_1.docx'); $_doc->setValue('position_at_work', $_POST["position_at_work"]); $_doc->setValue('me_unit', $_POST["me_unit"]); $_doc->setValue('me_name', $_POST["me_name"]); $_doc->setValue('long_vacation', $_POST["long_vacation"]); $_doc->setValue('date_start', $newformat_start); $_doc->setValue('date_end', $newformat_end); $res=$_doc->saveAs($_SERVER["DOCUMENT_ROOT"]."/sever/tmp.docx"); $fil=file_get_contents($_SERVER["DOCUMENT_ROOT"]."/sever/tmp.docx"); echo $fil; |
В результате мы получили файл docx. Другие статьи по PHP можете почитать здесь