Генерация docx на основе шаблона

Комментарии ()

Как мы уже наверное знаем, файлы docx и xlsx форматов представляют собой не что инное как zip-архив. Об этом можно почитать тут. В моем случае, мне был передан текстовый файл-шаблон  формата doc, в теле которого нужно подставлять нужные значения и генерить пачку файлов. 

Первым делом конвертируем doc в docx. Для решения поставленой задачи мне нужно на основе файла-шаблона создать рабочую копию, вытащить из него word/document.xml, сделать подстановку значений и запаковать назад.

Для подстановки значений использую PEAR'овский шаблонизатор HTML_Template_IT. Во первых я к нему превык, во вторых мне удобно пользоваться блоками в шаблоне. Написал клас Word. Пример использования:

<?php

            $word = new Word();
            $filename = "test.docx";

            $word->create($filename); // Создание нового файл на основе шаблона
            $word->extractTemplate($filename); // вытаскиваем document.xml
            // выполняем подставноку знечений с помощтю шаблонизатора document.xml
            $tpl = new HTML_Template_IT(_DIR . 'ptbr/word');
            $tpl->loadTemplatefile('document.xml', true, true);
            ...
            $tpl->setVariable('svnum', $svnum);
            $tpl->setVariable('date', $date);
            $tpl->setVariable('period', $period);
            ...
            $content = $tpl->get();

            $word->save($filename, $content); // Сохранение файла
        }
    }
}
?>

Нюансы:

В процессе редактирования docx-шаблона, создаются RSid-елеметы, которые используются для более эффективного слияния изменений одного документа. Они очень мешают, потому как разбивают в шаблоне переменную для подстановки на несколько частей. Решение нашел тут:

Нужно открыть редактор макросов (Alt+F11) и выполнить

Application.Options.StoreRSIDOnSave = False

Еще рукомендую перед сохранением шаблона :

  • выделить все и назначить один язык. Иначе текст тоже может быть разбит xml-форматированием. 
  • отключить проверку орфографии (потому как могут присутствувать xml данные вида  <w:proofErr w:type="gramStart"/>)

Webit.in.ua 2013