如何用OpenTBS在PHP项目中从嵌套数组生成Word表格?
使用OpenTBS生成分组表格的问题
我在PHP项目中用OpenTBS导出docx模板,初始代码和模板如下:
初始PHP代码
$surname_list = array( 'smith' => array( array( 'n_name' => 'jhon', 'n_surname' => 'smith', ), array( 'n_name' => 'mark', 'n_surname' => 'smith', ), ), 'cole' => array( array( 'n_name' => 'jenny', 'n_surname' => 'cole', ), array( 'n_name' => 'dennis', 'n_surname' => 'cole', ), array( 'n_name' => 'paul', 'n_surname' => 'cole', ), ), ); $TBS->MergeBlock('table_block', $surname_list);
初始docx模板内容
[table_block;block=begin] [block.tbs:table] Name | Surname [n_name] | [n_surname] [block.tbs:table;block=end] [table_block;block=end]
预期效果
希望生成按姓氏分组的多组表格,每个表格对应一个姓氏下的人员列表:
| Name | Surname |
|---|---|
| jhon | smith |
| mark | smith |
| Name | Surname |
|---|---|
| jenny | cole |
| dennis | cole |
| paul | cole |
但目前只能迭代主数组生成空表格结构,无法正确填充数据。
更新后的尝试
我修改了数组结构:
$surname_list = array( array( 'surname' => 'smith', 'people' => array( array( 'n_name' => 'jhon', 'n_surname' => 'smith', ), array( 'n_name' => 'mark', 'n_surname' => 'smith', ), ), ), array( 'surname' => 'cole', 'people' => array( array( 'n_name' => 'jenny', 'n_surname' => 'cole', ), array( 'n_name' => 'dennis', 'n_surname' => 'cole', ), array( 'n_name' => 'paul', 'n_surname' => 'cole', ), ), ), ); $TBS->MergeBlock('table_block', $surname_list);
并修改模板为:
[table_block;block=begin] [table_block.surname] [table_block;block=end]
现在能正确输出姓氏:
smith cole
但还是无法输出对应的people列表,请问该怎么实现预期的分组表格效果?
解决方案
要实现嵌套分组表格,需利用OpenTBS的嵌套块功能,在父分组块内部定义子块绑定people数组数据。
最终docx模板代码
[table_block;block=begin] [table_block.surname] [block.tbs:table] Name | Surname [table_block.people;block=tr] [n_name] | [n_surname] [table_block.people;block=end] [block.tbs:table;block=end] [table_block;block=end]
关键说明
- 父块
[table_block;block=begin/end]负责循环每个姓氏分组,生成独立的表格容器和姓氏标题 - 子块
[table_block.people;block=tr/end]绑定当前分组下的people数组,block=tr指定以表格行作为重复单元,每一条人员数据生成一行 [block.tbs:table/block=end]用于标记表格结构,确保OpenTBS正确解析表格的行列格式,避免生成格式错误
无需修改你更新后的PHP数组结构和MergeBlock调用,直接使用上述模板即可生成预期的分组表格。
内容的提问来源于stack exchange,提问作者xflea
相关产品推荐
相关产品推荐

