манипулирование шаблоном в PHPWord

Я использую генератор текстовых документов для PHP для модуля отчетов разрабатываемого мной веб-приложения. Я выбираю PHPWord, потому что бесплатная версия PHPDocX имеет очень ограниченную функциональность, а также имеет нижний колонтитул, что это всего лишь бесплатная версия. У меня есть шаблон, предоставленный клиентом. Я хочу загрузить шаблон и добавить к нему динамические элементы, такие как дополнительный текст или таблицы. Мой код здесь:

<?php
require_once '../PHPWord.php';

$PHPWord = new PHPWord();

$document = $PHPWord->loadTemplate('Template.docx');
$document->setValue('Value1', 'Great');

$section = $PHPWord->createSection();
$section->addText('Hello World!');
$section->addTextBreak(2);

$document->setValue('Value2', $section);

$document->save('test.docx');
?>

Я попытался создать новый раздел и попытался назначить его одной переменной в шаблоне (Value2), но появилась эта ошибка:

[28-Jan-2013 10:36:37 UTC] PHP Warning:  utf8_encode() expects parameter 1 to be string, object given in /Users/admin/localhost/PHPWord_0.6.2_Beta/PHPWord/Template.php on line 99

person John Micah Fernandez Miguel    schedule 28.01.2013    source источник


Ответы (3)


setValue ожидает, что второй параметр будет простой строкой. Невозможно предоставить объект раздела.

Я погрузился в код, и нет простого способа получить объект раздела, возвращающий значение, которое могло бы использоваться функцией setValue.

Поскольку у меня была такая же проблема, я написал патч для файла Template.php, который позволяет клонировать строки таблицы перед заменой их тегов на setValue. Каждая строка получает уникальный идентификатор, позволяющий идентифицировать теги шаблона для каждой отдельной строки.

Вот как это работает:

Добавьте эту функцию в свой файл Template.php (находится внутри каталога PHPWord)

public function cloneRow($search, $numberOfClones) {
    if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
        $search = '${'.$search.'}';
    }
    $tagPos      = strpos($this->_documentXML, $search);
    $rowStartPos = strrpos($this->_documentXML, "<w:tr", ((strlen($this->_documentXML) - $tagPos) * -1));
    $rowEndPos   = strpos($this->_documentXML, "</w:tr>", $tagPos) + 7;

    $result = substr($this->_documentXML, 0, $rowStartPos);
    $xmlRow = substr($this->_documentXML, $rowStartPos, ($rowEndPos - $rowStartPos));
    for ($i = 1; $i <= $numberOfClones; $i++) {
        $result .= preg_replace('/\$\{(.*?)\}/','\${\\1#'.$i.'}', $xmlRow);
    }
    $result .= substr($this->_documentXML, $rowEndPos);
    $this->_documentXML = $result;
}

В файле шаблона добавьте в каждую таблицу по одной строке, которую вы будете использовать в качестве строки шаблона. Предположим, вы добавили в эту строку тег $ {first_name}.

Чтобы получить таблицу с 3 строками, вызовите: $ document-> cloneRow ('first_name', 3);

Теперь рабочая копия вашего шаблона обновлена ​​таблицей, содержащей 3 строки. К каждому тегу внутри строки добавлен # и номер строки.

Чтобы установить значения, используйте setValue $ document-> setValue ('first_name # 1', 'Name on the first row'); $ document-> setValue ('first_name # 2', 'Имя во второй строке'); $ document-> setValue ('first_name # 3', 'Имя в третьей строке');

Надеюсь, это будет полезно! Я буду хранить обновленную версию кода и документации здесь: http://jeroen.is/phpword-templates-with-repeating-rows/

person Jeroen Moors    schedule 13.03.2013

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

Невозможно добавить новые элементы PHPWord в загруженный файл шаблона.

Документация

person Daniel Cisneros Medina    schedule 21.10.2014

Полностью новая версия CloneRow и setValue

Теперь вы можете клонировать объединенные ячейки. Исправлено множество ошибок с тегами OOXML.

И новый метод setValue - теперь игнорирующий мусорные теги внутри вашего шаблона. Нравиться

{My<trash ooxml tags>Pattern}

Вы можете найти код, документы и примеры здесь: https://github.com/Arisse/PHPWord_CloneRow

person Korimizu    schedule 13.02.2014