本文简单介绍如何在ThinkPHP3.2中使用PHPWord根据表格内容,动态生成多行表格。
有关在ThinkPHP3.2中使用PHPWord,可以参考“thinkphp3.2集成phpword,生成word文档并下载”这篇文章。实际开发中会遇到表格有多少行,数据是动态的,有几行数据就显示几行。使用模板创建word动态表格,步骤如下:
一、新建word模板
首先我们创建表格模板,只需要创建一行就行,然后我们在代码中根据实际情况进行复制,有多少行就复制多少行。模板的格式如下图,在模板中需要替换的内容,使用${替换内容}代替内容。本文示例模板名称为“template.docx”。
二、装载word模板
可以初始化“PhpOffice\PhpWord\TemplateProcessor”类或使用“PhpOffice\PhpWord\PhpWord”的loadTemplate方法,装载word模板。代码如下:
$document = new TemplateProcessor('wordfile/template.docx'); //载入模板文件 // $document = $PHPWord->loadTemplate('wordfile/temp.doc');
三、复制模板行
根据实际的记录数,复制模板行。复制时,只需提供模板行中随便一个变量,并指定复制的数量即可。代码如下(本文使用的mysql数据表为member表):
// 人员信息 $members = M('member')->select(); $memCount = count($members); // 复制表格模板行 $document->cloneRow('name', $memCount);
四、生成多行表格数据
循环记录数据,依次替换模板中的内容。第一行就是 原变量名#1,第二行就是 原变量名#2 ,以此类推,代码如下:
// 填充表格内容 foreach ($members as $k => $v) { $document->setValue('name#' . ($k + 1), $v['name']); $document->setValue('sex#' . ($k + 1), $v['sex']); $document->setValue('age#' . ($k + 1), $v['age']); $document->setValue('addr#' . ($k + 1), $v['addr']); }
五、生成word文档
通过以上步骤,设置完参数后,调用模板文档类的saveAs方法,生成word文件。代码如下:
$path = 'wordfile/report.docx'; $document->saveAs($path);
六、效果图
注意:
word模板和导出需使用docx,用doc会报错:Could not close zip file。
完整代码如下:
function createDoc() { // word使用docx,用doc会报错:Could not close zip file $document = new TemplateProcessor('wordfile/template.docx'); //载入模板文件 // $document = $PHPWord->loadTemplate('wordfile/temp.doc'); // 标题 $document->setValue('reportTitle', '人员信息表'); // 人员信息 $members = M('member')->select(); $memCount = count($members); // 复制表格模板行 $document->cloneRow('name', $memCount); // 填充表格内容 foreach ($members as $k => $v) { $document->setValue('name#' . ($k + 1), $v['name']); $document->setValue('sex#' . ($k + 1), $v['sex']); $document->setValue('age#' . ($k + 1), $v['age']); $document->setValue('addr#' . ($k + 1), $v['addr']); } $path = 'wordfile/report.docx'; $document->saveAs($path); die(); }