#php #templates #ms-word #phpword
Вопрос:
Я использую PHPWord для создания отчетов, которые используют .docx
шаблон.
Эта библиотека позволяет мне клонировать блок и клонировать строки таблицы. Однако примеры отделены друг от друга. Мне нужно объединить оба подхода, потому что моя таблица шаблонов выглядит так:
${block_group}
-------- ----------------------------------------------------------------
| Group: | ${group} |
-------- ------------ ---------------------------------------------------
| Name | Address |
--------------------- ---------------------------------------------------
| ${name} | ${address} |
--------------------- ---------------------------------------------------
${/block_group}
Требования:
- В этом отчете будет отдельная таблица для каждого
group
— (блок клонирования) - И каждый
group
/block
может иметь несколько строк таблицы — (строки таблицы клонирования)
Что У Меня Есть
До сих пор именно так выглядит мой код:
# 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. |
--------------------- ---------------------------------------------------