WithCoderWithCoderWithCoder

ThinkPhp使用PHPWord模板类生成动态表格

    本文简单介绍如何在ThinkPHP3.2中使用PHPWord根据表格内容,动态生成多行表格。

    有关在ThinkPHP3.2中使用PHPWord,可以参考“thinkphp3.2集成phpword,生成word文档并下载”这篇文章。实际开发中会遇到表格有多少行,数据是动态的,有几行数据就显示几行。使用模板创建word动态表格,步骤如下:

    一、新建word模板

    首先我们创建表格模板,只需要创建一行就行,然后我们在代码中根据实际情况进行复制,有多少行就复制多少行。模板的格式如下图,在模板中需要替换的内容,使用${替换内容}代替内容。本文示例模板名称为“template.docx”。

    1-201104110212b3.png

    二、装载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);

    六、效果图

    1-201104110T31Y.png   

    注意:

        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();
}


欢迎分享交流,转载请注明出处:WithCoder » ThinkPhp使用PHPWord模板类生成动态表格