PHPExcel如何绘制普通图表、组合图表及表格优化的注意事项。

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轴的值,数据,对应的标签(标签的作用主要还是方便看出对应哪一类型)。然后建立一个图表类型,将取到的值构建成一个图表。最后再通过图表的配置,设置一些边边角角,如名称啊,标题啊什么的。
组合图表也不复杂,就是构建图表的时候,将两个图表类型放到一个数组中,合并成一个图表。
需要注意的地方,注释里也有指出。最主要的还是要实践,因为相应的文档太少,只有实践才能知道,哪些参数必须配置,哪些参数可以不配置(项目需要)。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值