WithCoderWithCoderWithCoder

ThinkPhp使用PHPWord模板类生成报表页面(含文字图片)

    本文简单介绍如何在ThinkPHP3.2中使用PHPWord生成报表页面的word文档并下载,报表带文字和百度Echarts的图表图片。

    有关在ThinkPHP3.2中使用PHPWord,可以参考“thinkphp3.2集成phpword,生成word文档并下载”这篇文章。而使用模板创建word文档,步骤如下:

    一、新建word模板

    模板的格式如下图,在模板中需要替换的内容,使用${替换内容}代替内容。本文示例模板名称为“template.docx”。

    1-201104100G9115.png

    二、装载word模板    

    可以初始化“PhpOffice\PhpWord\TemplateProcessor”类或使用“PhpOffice\PhpWord\PhpWord”的loadTemplate方法,装载word模板。代码如下:

$document = new TemplateProcessor('wordfile/template.docx');
//载入模板文件
// $document = $PHPWord->loadTemplate('wordfile/temp.doc');

    三、设置模板字符串参数值

    通过模板类的setValue方法,设置模板的字符串参数值,代码如下:

$document->setValue('reportTitle', '温度监测综合日报');
$document->setValue('projectName', 'XX监测项目');
$document->setValue('addr', '陕西西安');
$document->setValue('startDate', '2020-01-01');
$document->setValue('endDate', '2020-10-01');

    四、设置模板图片参数值

    本文图片使用的是Echarts图表的getDataURL方法返回的图片内容,并通过post方法传递到服务端。如何将dataurl内容转换为图片,参考“PHP将canvas的dataurl转成图片image”。将图片保存到本地磁盘后,使用模板类的setImageValue方法,设置模板的图片参数,方法调用及参数构造如下代码(参数设置完成后,可以使用unlink删除临时图片):

// 图片处理
$img = I('post.temp');
$imgdata = substr($img, strpos($img, ",") + 1);
$decodedData = base64_decode($imgdata);
$filename = "wordfile/temp.png";
$pngfiles[] = $filename;

// 转存到硬盘
file_put_contents($filename, $decodedData);

// 设置图片参数
$picParam = array("path" => $filename, "width" => 400, "height" => 200);
$document->setImageValue('temp', $picParam);

//删除csv临时文件
unlink($filename);

    五、生成word文档

    通过以上步骤,设置完参数后,调用模板文档类的saveAs方法,生成word文件。代码如下:

$path = 'wordfile/report.docx';
$document->saveAs($path);

    六、效果图

    1-20110410291S19.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', '温度监测综合日报');
    $document->setValue('projectName', 'XX监测项目');
    $document->setValue('addr', '陕西西安');
    $document->setValue('startDate', '2020-01-01');
    $document->setValue('endDate', '2020-10-01');

    // 图片处理
    $img = I('post.temp');
    $imgdata = substr($img, strpos($img, ",") + 1);
    $decodedData = base64_decode($imgdata);
    $filename = "wordfile/temp.png";
    $pngfiles[] = $filename;

    // 转存到硬盘
    file_put_contents($filename, $decodedData);

    // 设置图片参数
    $picParam = array("path" => $filename, "width" => 400, "height" => 200);
    $document->setImageValue('temp', $picParam);

    //删除csv临时文件
    unlink($filename);

    $path = 'wordfile/report.docx';
    $document->saveAs($path);
    die();
}


欢迎分享交流,转载请注明出处:WithCoder » ThinkPhp使用PHPWord模板类生成报表页面(含文字图片)