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}                                        |
+---------------------+---------------------------------------------------+

经过无数次尝试,我终于找到了一个方法(我不确定这是不是最好的方法,但它确实有效)

假设假设我的数据是这样的:

$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.                                     |
+---------------------+---------------------------------------------------+

最新更新