使用phpword替换模板内容 在模板追加内容

最近遇到一个需求,需要根据数据生成一份word文档,于是就研究了下phpword。

phpword生成word文档有两种方法

1 直接生成word文档 例如$phpWord = new PHPWord(); 然后可以在新的文档里用代码写所需要的内容 如 表格,图表,图片等。 相信弄过的同学都知道调样式的痛苦,所以这种方法不推荐。

2 使用word模板,在模板里设置变量 然后替换变量就行了。这种方法简单快捷 大力推荐。

下面正式开始

1 安装phpword 我用的laravel框架 所以就用composer安装phpword

    composer require phpoffice/phpword  假如报版本冲突的话就忽略版本  composer require phpoffice/phpword –ignore-platform-reqs

2 提供一个模板 如下图所示

《使用phpword替换模板内容 在模板追加内容》

然后把里面需要替换的内容用变量代替

如下所示

《使用phpword替换模板内容 在模板追加内容》

把模板命名并放到你能找到的位置里。我放的路径是public/fiels/autoload.docx

3 开始撸代码,替换模板中的变量并生成新的word文档

先引入包

use PhpOffice\PhpWord\TemplateProcessor;
use PhpOffice\PhpWord\Element\Chart;
引入模板替换变量
$tmp = new TemplateProcessor('files/autoload.docx');
$tmp->setValue('address', '上海市闵行区顾戴路666号');
$tmp->setValue('days', '120');
$tmp->saveAs("aa.docx");//另存为

打开aa.docx发现变量已经被替换了

《使用phpword替换模板内容 在模板追加内容》

表格的行数不是固定的 用这个方法不行,那怎么办呢? 很简单 克隆行

//复制行
$arr = [
    ['id' => '1', 'id1' => '10', 'id2' => '11', 'id3' => '12', 'id4' => '13', 'capacity' => '10.2Ah'],
    ['id' => '2', 'id1' => '20', 'id2' => '21', 'id3' => '22', 'id4' => '23', 'capacity' => '11.2Ah'],
    ['id' => '3', 'id1' => '30', 'id2' => '31', 'id3' => '32', 'id4' => '33', 'capacity' => '12.2Ah'],
    ['id' => '4', 'id1' => '40', 'id2' => '41', 'id3' => '42', 'id4' => '43', 'capacity' => '13.2Ah'],
    ['id' => '5', 'id1' => '50', 'id2' => '51', 'id3' => '52', 'id4' => '53', 'capacity' => '14.2Ah'],
];
$rows = count($arr);//总行数
$tmp->cloneRow('id', $rows);//复制行
for ($i = 0; $i < $rows; $i++) {
    $tmp->setValue("id#" . ($i + 1), $arr[$i]['id']);//替换变量
    $tmp->setValue("id1#" . ($i + 1), $arr[$i]['id1']);
    $tmp->setValue("id2#" . ($i + 1), $arr[$i]['id2']);
    $tmp->setValue("id3#" . ($i + 1), $arr[$i]['id3']);
    $tmp->setValue("id4#" . ($i + 1), $arr[$i]['id4']);
    $tmp->setValue("capacity#" . ($i + 1), $arr[$i]['capacity']);
}

结果如下

《使用phpword替换模板内容 在模板追加内容》

最后是图表 图表的数量也不是固定的 怎么搞?用克隆块

如模板所示

${char_black}

${char}

${/char_black}

和html标签很像 是成对出现 如果没有结束标签则克隆块无效 里面可以放任意的元素,文字,表格,图片等。

首先创建一个chart

$categories = array('3月1日', '3月2日', '3月3日', '3月4日', '3月5日', '3月6日', '3月7日', '3月8日', '3月9日', '3月10日', '3月11日');
$series1 = array(80, 90, 95, 87, 80, 90, 95, 87, 80, 90, 95);
$chart = new Chart('column', $categories, $series1,[],'图表');
new Chart方法第一个参数是图表类别一共有十二种 分别是'pie', 'doughnut', 'line', 'bar', 'stacked_bar', 'percent_stacked_bar', 'column', 'stacked_column', 'percent_stacked_column', 'area', 'radar', 'scatter'
第二个参数是x轴数据 第三个参数是y轴数据,第四个参数是图表样式,第五个参数是y轴数据名称

然后复制块

$tmp->cloneBlock('char_black', 3,true,true);
$tmp->setChart('char#1', $chart);
$tmp->setChart('char#2', $chart);

看效果

《使用phpword替换模板内容 在模板追加内容》

虽然图表出来了但效果显然不能让人满意 那就调样式

$dataLabel=['showCatName'=>false];
$chart->getStyle()
    ->setTitle('图表示例')
    ->setShowAxisLabels()
    ->setWidth(Converter::inchToEmu(6))
    ->setHeight(Converter::inchToEmu(3))
    ->setShowGridY()
    ->setDataLabelOptions($dataLabel);

在看效果

《使用phpword替换模板内容 在模板追加内容》

OK 收工

下面说下图表样式setDataLabelOptions 默认的数据标签是这样,假如我们不行让x轴的数据显示则需要设置下数据标签默认的数据标签数据为
       ‘showVal’          => true, // value
        ‘showCatName’      => true, // category name
        ‘showLegendKey’    => false, //show the cart legend
        ‘showSerName’      => false, // series name
        ‘showPercent’      => false,
        ‘showLeaderLines’  => false,
        ‘showBubbleSize’   => false,

所以我们需要设置下数据标签 $dataLabel=[‘showCatName’=>false]; 然后 setDataLabelOptions($dataLabel);要记的这个属性要放在设置样式的最后一行不然会报错。

《使用phpword替换模板内容 在模板追加内容》

 

 

 

 

 

 

    原文作者:lunarnan
    原文地址: https://blog.csdn.net/lunarnan/article/details/116057896
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞