最近遇到一个需求,需要根据数据生成一份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 提供一个模板 如下图所示

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

把模板命名并放到你能找到的位置里。我放的路径是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发现变量已经被替换了

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

//复制行
$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']);

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

如模板所示

${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);

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

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

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);要记的这个属性要放在设置样式的最后一行不然会报错。

最近遇到一个需求,需要根据数据生成一份word文档,于是就研究了下phpword。phpword生成word文档有两种方法1 直接生成word文档 例如$phpWord = new PHPWord(); 然后可以在新的文档里用代码写所需要的内容 如 表格,图表,图片等。 相信弄过的同学都知道调样式的痛苦,所以这种方法不推荐。2 使用word模板,在模板里设置变量 然后替换变量就行了。这种方法简单快捷 大力推荐。下面正式开始1 安装phpword 我用的laravel框架 所以就用comp
phpword处理docx模板时候始终发生神奇的BUG,就是复制原版例子里的${Value1}进自己的模板然后替换是没问题的,但是只要一改动这个变量文字,PHP做相应替换就失效了。 用了下残废百度无果,一怒翻起google,准确度高多了。 copy一篇比较nice的博文做个备份 转载自:http://wangye.org/blog/archives/943/ ==============...
$PHPWord = new PHPWord(); $PHPWord->addFontStyle('rStyle', array('bold' => true, 'italic' => true, 'size' => 16)); $PHPWord->addParagraphStyle('pStyle', array( 使用phpword生成文档有两种方式 直接使用代码编写word文档,用代码生成word,但是设置样式,格式,图片非常麻烦,不建议使用。如果客户或产品提供一份word的样式,我们也难以完全复原,调样式很头疼的。 读取原有word模板替换相关变量。个人感觉这种方式能满足绝大部分需求,实现起来也比较简单,所有的样式,格式直接在word模板里设置好,替换变量就可以了,还可以很方便的切换模板。本文主要介绍这种方式,毕竟我们是为了快速实现客户的需求,让客户提供一份word模板,我们稍微一改就可以了 public function cloneBlockstr($blockname, $clones = 1, $replace = true, $indexVariables = false, $variableReplacements = null) echo date('Y-m-d h:i:s', time())... 两个地方有问题: 1.编码格式有误 HotelName=%e5%8c%97%e4%ba%ac%e5%8d%8e%e5%87%af%e5%ae%be%e9%a6%86" ——这里使用的是URLEncode的方式编码的,使用lr_convert_string_encoding 这个函数转化中文是不行 2.C语言变量和LR变量混淆一通。。 char temp; char hotelname[4096]; ——从这里看这两个参数都是C语言字符串,temp定义也有误,这里定义的字符。。 lr_convert_string_encoding(lr_eval_string("{hotel_name}"),LR_ENC_SYSTEM_LOCALE, LR_ENC_UTF8 ,"temp");——这里是新建了LR的temp变量,和C语言变量重名了。。 strcat(hotelname,lr_eval_string ( "{temp}" )); HotelName={hotelname} ——这里完全是胡乱在用变量。。web_url里面{hotelname}能识别是的LR自己的变量 如果需要用,一句就搞定了啊,不需要单独定义C变量 lr_convert_string_encoding(lr_eval_string("{hotel_name}"),LR_ENC_SYSTEM_LOCALE, LR_ENC_UTF8 ,"hotelname"); 后面的web_url也能正常执行了。 loadrunner——常见函数 zhgddyhh: [code=html] <h1> test</h1> [/code] LR— 26377错误 hl20000000: 你好,我的脚本在回放时出现这个问题。我是手动写的关于url请求的脚本,没有录制。在下一个请求地址中需要前一个地址返回的一个参数,可是 web_reg_save_param中总是不能保存这个参数值;有解决方法吗?谢谢 LR— 26377错误 ~小龙~: 最近出了这个问题,很棘手哈! 交易响应时间258原则 zl_dream1106: 一直没有查到该原则的来源,能说一下这个2-5-8原则的来源是哪里么?