Обработка шаблона PHPWord с клонированием строк блока внутри клона блока

#php #templates #ms-word #phpword

Вопрос:

Я использую PHPWord для создания отчетов, которые используют .docx шаблон.

Эта библиотека позволяет мне клонировать блок и клонировать строки таблицы. Однако примеры отделены друг от друга. Мне нужно объединить оба подхода, потому что моя таблица шаблонов выглядит так:

 ${block_group}
 -------- ---------------------------------------------------------------- 
| Group: | ${group}                                                       |
 -------- ------------ --------------------------------------------------- 
| Name                | Address                                           |
 --------------------- --------------------------------------------------- 
| ${name}             | ${address}                                        |
 --------------------- --------------------------------------------------- 
${/block_group}
 

Требования:

Что У Меня Есть

До сих пор именно так выглядит мой код:

 # Create the template processor
$templateProcessor = new TemplateProcessor('/path/to/template/Template.docx');

# Block cloning
$replacements = array(
    array('group' => 'Group 1'),
    array('group' => 'Group 2')
);
$templateProcessor->cloneBlock('block_group', 0, true, false, $replacements);
 

Как вы можете видеть, $replacements я позаботился только о ${group} заполнителе, потому что это единственное, о чем я беспокоюсь на этом clone block этапе. Теперь у меня есть две таблицы, ${group} заполнители установлены правильно, так что переходите к ${name} ${address} заполнителям и.

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


Вот как выглядит файл, который я получаю при запуске моего текущего кода:

  -------- ---------------------------------------------------------------- 
| Group: | Group 1                                                        |
 -------- ------------ --------------------------------------------------- 
| Name                | Address                                           |
 --------------------- --------------------------------------------------- 
| ${name}             | ${address}                                        |
 --------------------- --------------------------------------------------- 

 -------- ---------------------------------------------------------------- 
| Group: | Group 2                                                        |
 -------- ------------ --------------------------------------------------- 
| Name                | Address                                           |
 --------------------- --------------------------------------------------- 
| ${name}             | ${address}                                        |
 --------------------- --------------------------------------------------- 
 

Ответ №1:

После бесчисленных попыток я, наконец, нашел способ сделать это (не совсем уверен, что это лучший подход, но он работает).

Допущения

Предполагая, что мои данные выглядят так:

 $data = array(
    'Group 1' => array(
        array(
            'name' => 'John Smith',
            'address' => '123 Main Rd.'
        ),
        array(
            'name' => 'Jane Doe',
            'address' => '456 Second St.'
        )
    ),
    'Group 2' => array(
        array(
            'name' => 'Noah Ford',
            'address' => '987 Rich Blvd.'
        ),
        array(
            'name' => 'Oliver Brown',
            'address' => '654 Third St.'
        )
    )
);
 

Блок клонирования

Первым шагом является клонирование block :

 # Block cloning
$replacements = array();
$i = 0;
foreach($data as $group_name => $group) {
    $replacements[] = array(
        'group' => $group_name,
        'name' => '${name_'.$i.'}',
        'address' => '${address_'.$i.'}'
    );

    $i  ;
}
$templateProcessor->cloneBlock('block_group', count($replacements), true, false, $replacements);
 

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

После этого кода документ должен выглядеть следующим образом:

  -------- ---------------------------------------------------------------- 
| Group: | Group 1                                                        |
 -------- ------------ --------------------------------------------------- 
| Name                | Address                                           |
 --------------------- --------------------------------------------------- 
| ${name_0}           | ${address_0}                                      |
 --------------------- --------------------------------------------------- 

 -------- ---------------------------------------------------------------- 
| Group: | Group 2                                                        |
 -------- ------------ --------------------------------------------------- 
| Name                | Address                                           |
 --------------------- --------------------------------------------------- 
| ${name_1}           | ${address_1}                                      |
 --------------------- --------------------------------------------------- 
 

Клонировать Строку Таблицы

Последним шагом является клонирование строк таблицы в соответствии с вашими данными.

 # Table row cloning
$i = 0;
foreach($data as $group) {
    $values = array();
    foreach($group as $row) {
        $values[] = array(
            "name_{$i}" => $row['name'],
            "address_{$i}" => $row['address']
        );
    }
    $templateProcessor->cloneRowAndSetValues("name_{$i}", $values);

    $i  ;
}
 

После этого кода документ должен выглядеть следующим образом:

  -------- ---------------------------------------------------------------- 
| Group: | Group 1                                                        |
 -------- ------------ --------------------------------------------------- 
| Name                | Address                                           |
 --------------------- --------------------------------------------------- 
| John Smith          | 123 Main Rd.                                      |
 --------------------- --------------------------------------------------- 
| Jane Doe            | 456 Second St.                                    |
 --------------------- --------------------------------------------------- 

 -------- ---------------------------------------------------------------- 
| Group: | Group 2                                                        |
 -------- ------------ --------------------------------------------------- 
| Name                | Address                                           |
 --------------------- --------------------------------------------------- 
| Noah Ford           | 987 Rich Blvd.                                    |
 --------------------- --------------------------------------------------- 
| Oliver Brown        | 654 Third St.                                     |
 --------------------- ---------------------------------------------------