最近遇到一个需求,需要根据数据生成一份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:
LR— 26377错误
hl20000000:
LR— 26377错误
~小龙~:
交易响应时间258原则
zl_dream1106: