PHPExcel的强大之处就是可以让我这样不会excel程序员,也能生成好看的表格,绘制合适的图表。
本篇文章重点是如何绘制图表和组合图表。因为优化表格在网上有很多中文文档,所以这里没必要再重复。但是我会结合使用过程中产生的问题,做一些说明。
表格注意事项
默认设置(许多文档没有设置默认值这一配置项,这里指出一下,phpexcel有些配置是可以设置成默认的,下面是一个水平垂直居中的设置)
$resultPHPExcel->getActiveSheet()->getDefaultStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$resultPHPExcel->getActiveSheet()->getDefaultStyle()->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
单元格宽度默认(可能是对中文支持不好,默认宽度在使用中文时经常失效,建议使用实际宽度设置)
$resultPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
$resultPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setWidth(20);
设置填充颜色或整行字体(虽然phpexce支持行的设置,但是存在单元格合并时,正行设置会失效,建议去单元格设置)
先看一下我项目中生成的一些图表
图表
折线图
//绘制图表标签(图表中代表类型的标签,比如折线图,哪条线对应什么分类。)
$labels = array(
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$A$4',null,1),
/**实例化这个类时带有4个参数,
第一个需要配置数据类型(数据类型不正确绘制不出折线)
第二个为取值的单元格($sheet_title,是我项目中的一个变量,保存的时sheet页的标题。后跟着的$A$4即为对应单元格)
第三个参数做什么我也不清楚…….
第四个参数为所取单元格数量,这里只取了一个参数即值为1
(实践出真理,当数据可变,比如一个库表每天导出的数据量都不同的时候,第四个参数可以不用配置。所以这里的参数没多大用,但是为了数据规范,如果数据固定,最好配置)**/
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$A$5',null,1),
);
//绘制图表X轴(即图表中X轴的取值,Y轴和excel一样自动生成不需要配置。)
$xlabels = array(
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$D$2:$'.$columnID.'$2',null,$sum
)
);
//绘图所需要的数据(即对应X轴所取的值)
$datas = array(
new \PHPExcel_Chart_DataSeriesValues('Number',$sheet_title.'!$D$4:$'.$columnID.'$4',null,$sum
),
new \PHPExcel_Chart_DataSeriesValues('Number',$sheet_title.'!$D$5:$'.$columnID.'$5',null,$sum
),
);
//这里是搭建一个图表的整体框架。
$series = array(
new \PHPExcel_Chart_DataSeries(
//这里设置生成图表类型(折线图,柱状图,饼状图…)
\PHPExcel_Chart_DataSeries::TYPE_LINECHART,
//设置当前图表展示类型(堆积,非堆积,百分比),根据不同图表设置不同。
\PHPExcel_Chart_DataSeries::GROUPING_STANDARD,
//这里需要返回一个数组,有多少条数据需要多少长度的数组。
range(0, count($datas)-1),
//标签
$labels,
//X轴数据
$xlabels,
//绘图所需数据
$datas
)
);
//这里是对图表的布局(在图表上显示值,或者百分比,还有其他一些参数配置。可参考相应类文件)
$layout = new \PHPExcel_Chart_Layout();
$layout->setShowVal(true);
//这里和布局类配合使用,将布局添加到图表中。
$areas = new \PHPExcel_Chart_PlotArea(null,$series);
//这里设置标签的显示位置(上,下,左,右,左上,右上给相应参数就行)
$legend=new \PHPExcel_Chart_Legend(\PHPExcel_Chart_Legend::POSITION_BOTTOM,$layout,false);
//这里设置图表的title 即表头标题
$title = new \PHPExcel_Chart_Title('曝光量KPI每日达成情况');
//最后一步,生成一个图表
$chart = new \PHPExcel_Chart(
'line_chart', //图表名称,可理解为我们常使用的图1,图2…
$title, //图表标题,和上面的名称不同
$legend, //图表标签的位置
$areas, //构建好的图表框架
true, //没使用过
false, //没使用过(感觉没什么用,好奇的可以翻文档研究)
null, //x轴单位,配置类似title
null //x轴单位,配置类似title
);
//图表在excel中生成的位置。
$chart->setTopLeftPosition('A11')->setBottomRightPosition($xcellID.'26');
//将图表插入到当前sheet页中。
$resultPHPExcel->getActiveSheet()->addChart($chart);
//最后还有一个非常重要也容易遗漏的地方。在生成excel时要配置一下两行代码,两个要点,第一行生成2007版的excel,之前的版本不能生成图表,第二行的意思是,excel中要包含图表,默认为flase,需要配置。
$xlsWriter = new \PHPExcel_Writer_Excel2007($resultPHPExcel);
$xlsWriter->setIncludeCharts(true);
一个简单的图表搭建就完成了,根据以上步骤在excel画出一个图表,应该没什么问题。
饼图
因为折线图已经给出很详细的注释,这里将不再啰嗦,只分析两种图表不一样的地方。
$labels = array(
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$A$'.($j+15),null,1),
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$A$'.($j+16),null,1),
); //取绘制图表标签
$xlabels = array(
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$A$'.($j+15).':$A$'.($j+16),null,2
)
); //取图表x轴坐标
$datas = array(
new \PHPExcel_Chart_DataSeriesValues('Number',$sheet_title.'!$B$'.($j+15).':$B$'.($j+16),null,2
),
); //绘图需要数据
$series = array(
new \PHPExcel_Chart_DataSeries(
//这里定义这个图表为饼图(phpexcel每种图对应的参数,在他类文件里都有定义。)
\PHPExcel_Chart_DataSeries::TYPE_PIECHART,
//饼图类型(百分比)
\PHPExcel_Chart_DataSeries::GROUPING_PERCENT_STACKED,
range(0,1),
$labels,
$xlabels,
$datas
)
); //根据取得的东西做出一个图表框架
$layout = new \PHPExcel_Chart_Layout();
// $layout->setShowVal(true);
$layout->setShowPercent(TRUE);
$areas = new \PHPExcel_Chart_PlotArea($layout,$series);
$legend =new \PHPExcel_Chart_Legend(\PHPExcel_Chart_Legend::POSITION_RIGHT,$layout,false);
$title = new \PHPExcel_Chart_Title('时间完成比例');
$chart = new \PHPExcel_Chart(
'line_chart',
$title,
$legend,
$areas,
true,
false,
null,
null
);//生成一个图标
$chart->setTopLeftPosition('A81')->setBottomRightPosition('C101');
$resultPHPExcel->getActiveSheet()->addChart($chart);
从两个图表的配置可以看出,其实参数的设置都是一样的。只有后面的图表类型需要设置。
组合图
组合图即为一个图表中有两种类型的图。因为一些项目的需要,要在一个图表中对比两种类型数据的走势。所以出现组合图。
绘制组合图的思路其实很简单,就是将两种类型类标签,两种类型类数据组合到一个图表中,X轴不变。(这里PHPExcel有个没中不足的地方,不能生成次坐标轴。也就是我们说的双Y轴。因为两类数据可能相差太大,无法很感官的看出对比。解决方法只能在生成图表之后,通过excel,手动生成次坐标轴。)
//设置第一个标签
$labels1 = array(
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$A$'.($j+31),null,1),
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$A$'.($j+33),null,1),
);
//设置第二个标签(这里注意,对应好每个标签对应的数据和图表类型,比较容易混乱)
$labels2 = array(
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$A$'.($j+32),null,1),
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$A$'.($j+34),null,1),
);
//设置X轴(两种图都使用同一X轴)
$xlabels = array(
new \PHPExcel_Chart_DataSeriesValues('String',$sheet_title.'!$C$'.($j+30).':$'.$columnID.'$'.($j+30),null,10
)
);
//对应第一个标签取得数据。
$datas1 = array(
new \PHPExcel_Chart_DataSeriesValues('Number',$sheet_title.'!$C$'.($j+31).':$'.$columnID.'$'.($j+31),null,10
),
new \PHPExcel_Chart_DataSeriesValues('Number',$sheet_title.'!$C$'.($j+33).':$'.$columnID.'$'.($j+33),null,10
)
);
//生成一个图表框架,这里生成第一个图表柱状图。
$series1 = new \PHPExcel_Chart_DataSeries(
\PHPExcel_Chart_DataSeries::TYPE_BARCHART,
\PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED,
range(0,1),
$labels1,
$xlabels,
$datas1
);
//这里有个重要的配置,主要的对第一个图表柱状图绘图方式的设置。(横着展示还是竖着展示)
$series1->setPlotDirection(\PHPExcel_Chart_DataSeries::DIRECTION_COL);
//对应第二个标签取第二个图表的数据
$datas2 = array(
new \PHPExcel_Chart_DataSeriesValues('Number',$sheet_title.'!$C$'.($j+32).':$'.$columnID.'$'.($j+32),null,10
),
new \PHPExcel_Chart_DataSeriesValues('Number',$sheet_title.'!$C$'.($j+34).':$'.$columnID.'$'.($j+34),null,10
)
);
//同样生成第二个图表框架,这里是一个折线图
$series2 = new \PHPExcel_Chart_DataSeries(
\PHPExcel_Chart_DataSeries::TYPE_LINECHART,
\PHPExcel_Chart_DataSeries::GROUPING_STANDARD,
range(0,1),
$labels2,
null,
$datas2
);
$layout = new \PHPExcel_Chart_Layout();
// $layout->setShowVal(true);
$layout->setShowPercent(TRUE);
//将两个图表组合都一起 到这里基本上就完成了组合图的生成。
$areas = new \PHPExcel_Chart_PlotArea($layout,array($series1, $series2));
$legend =new \PHPExcel_Chart_Legend(\PHPExcel_Chart_Legend::POSITION_RIGHT,$layout,false);
$title = new \PHPExcel_Chart_Title('网络每日费用情况(单位:万)');
$chart = new \PHPExcel_Chart(
'line_chart',
$title,
$legend,
$areas,
true,
false,
null,
null
);//生成一个图标
$chart->setTopLeftPosition('A1')->setBottomRightPosition('J20');
$resultPHPExcel->getActiveSheet()->addChart($chart);
这里生成的组合图,因为不能设置次坐标轴,数据相差又太多,所以柱状图的长度根本看不清。
解决方法可以通过excel手工设置。
这里选择次坐标轴就可以生成可视的比较好看的图表。
ps:图表结果可能跟代码对应不上,不过不影响代码生成结果。因为太懒没有再去编辑代码,所以直接拷贝是无法使用,有兴趣的可以自己下载PHPExcel动手试一试,实践出真理!
做一个小总结,其实使用PHPExcel 生成图表的思路还是挺清晰的。而且和直接使用excel绘制图的思路差不多。首先需要取到X轴的值,数据,对应的标签(标签的作用主要还是方便看出对应哪一类型)。然后建立一个图表类型,将取到的值构建成一个图表。最后再通过图表的配置,设置一些边边角角,如名称啊,标题啊什么的。
组合图表也不复杂,就是构建图表的时候,将两个图表类型放到一个数组中,合并成一个图表。
需要注意的地方,注释里也有指出。最主要的还是要实践,因为相应的文档太少,只有实践才能知道,哪些参数必须配置,哪些参数可以不配置(项目需要)。