Первое с чего нужно начать, это создать .docx документ на своем ПК, например template.docx
Для примера я взял куски из договора на создание сайта
Подготавливаем шаблон word документа
Открываем word файл и начинаем его шаблонизировать путем замены текста на переменные синтаксиса типа ${data}
У нас будут следующие переменные, которые мы будем подставлять в документ:
${num_dogovor}
- номер догвоора
${city}
- город
${date}
- текущая дата
${name}
- ФИО
${company}
- Название Организации ООО
${summa}
- Сумма
${summa_str}
- Сумма, прописью
${summa_nalog}
- Налог, 6% от суммы
${summa_nalog_str}
- Налог, 6% от суммы (прописью)
${ur_address}
- Юр. адрес
${post_address}
- Почтовый адрес
${company_ogrn}
- ОГРН
${company_okpo}
- ОКПО
${company_kpp}
- КПП
${company_inn}
- ИНН организации
${company_bank}
- Название банка
${company_ks}
- кор. счет
${company_rs}
- р. счет
${direktor}
- ФИО директора
Далее скачиваем библиотеку PhpWord
Создаем word документ
//Подключаем библиотеку
require $_SERVER["DOCUMENT_ROOT"].'/lib/phpword/autoload.php';
//создаем класс
$phpWord = new \PhpOffice\PhpWord\PhpWord();
$_doc = new \PhpOffice\PhpWord\TemplateProcessor('template.docx');
Синтаксис для замены переменных
$_doc->setValue('num_dogovor', $number_document);
Подготовим пару переменных
//запихиваем сумму в переменную, что бы далее с ней поработать
$summa = 25550;
// делаем красивый формат
$summa_format = number_format($summa, 2, ',', ' ');
// вычислим налог от суммы (6%) и так же определим в отдельную переменную красивый формат суммы
$summa_nalog = $summa * 6 / 100;
$summa_nalog_format = number_format($summa_nalog, 2, ',', ' ');
Подставляем, заменяем переменные в word документ
$_doc->setValue('num_dogovor', $number_document);
$_doc->setValue('city', "г. Сочи");
$_doc->setValue('name', "Масков Илон Гениальнович");
$_doc->setValue('date', date("d.m.Y"));
$_doc->setValue('company', "ООО НЕ ПРОХОДИТЕ МИМО");
$_doc->setValue('summa', $summa_format);
$_doc->setValue('summa_str', num2str($summa));
$_doc->setValue('summa_nalog', $summa_nalog);
$_doc->setValue('summa_nalog_str', num2str($summa_nalog));
$_doc->setValue('company_ogrn', "ОГРН компании");
$_doc->setValue('company_inn', "ИНН компании");
$_doc->setValue('company_kpp', "КПП компании");
$_doc->setValue('company_bank', "Какое то название банка");
$_doc->setValue('company_bik', "бик банка");
$_doc->setValue('company_ks', "12342352456235");
$_doc->setValue('company_rs', "66666666666");
$_doc->setValue('ur_address', "Юридический адрес, какой-нибудь");
$_doc->setValue('post_address', "Фактический адрес");
$_doc->setValue('direktor', "Альберт Енштейн");
$_doc->setValue('company_okpo', "4444444");
Сохраняем сгенерированный word файл на сервер
$img_Dir_Str = "/files/";
$img_Dir = $_SERVER['DOCUMENT_ROOT']."/". $img_Dir_Str;
@mkdir($img_Dir, 0777);
$file = str_replace("/","-", "Договор №".date("d-m-Y")).".docx";
$_doc->saveAs($img_Dir.$file);
Обратите внимание на строку: $_doc->setValue('summa_str', num2str($summa));
и $_doc->setValue('summa_nalog_str', num2str($summa_nalog));
В ней мы используем функцию перевода числа в прописной вид
Функция перевода числа в прописной вид
function num2str($num) {
$nul='ноль';
$ten=array(
array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять'),
);
$a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
$tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
$hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот','восемьсот','девятьсот');
$unit=array( // Units
array('коп.' ,'коп.' ,'коп.', 1),
array('рубль' ,'рубля' ,'рублей' ,0),
array('тысяча' ,'тысячи' ,'тысяч' ,1),
array('миллион' ,'миллиона','миллионов' ,0),
array('миллиард','милиарда','миллиардов',0),
);
//
list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num)));
$out = array();
if (intval($rub)>0) {
foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
if (!intval($v)) continue;
$uk = sizeof($unit)-$uk-1; // unit key
$gender = $unit[$uk][3];
list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
// mega-logic
$out[] = $hundred[$i1]; # 1xx-9xx
if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
// units without rub & kop
if ($uk>1) $out[]= morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
} //foreach
}
else $out[] = $nul;
$out[] = morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
$out[] = $kop.' '.morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
return trim(preg_replace('/ {2,}/', ' ', join(' ',$out)));
}
/**
* Склоняем словоформу
* @ author runcore
*/
function morph($n, $f1, $f2, $f5) {
$n = abs(intval($n)) % 100;
if ($n>10 && $n<20) return $f5;
$n = $n % 10;
if ($n>1 && $n<5) return $f2;
if ($n==1) return $f1;
return $f5;
}