zoukankan      html  css  js  c++  java
  • phpexcel图形图表(一)入门

    PHPExcel - Excel的PHP处理引擎

    PHPExcel 提供了一系列的 PHP语言 类,让你可以轻松地读写操作以下格式的文件:.xls/.xlsx/.csv/.ods/Gnumeric/PDF/HTML...
    主要功能包括:设置文件的meta信息,多工作表,定制字体和样式,边框和填充,图片,计算公式,转换文件类型等等

    之前我只是用到了导出数据到列表格式的Excel文件,这次需要实现的目标是:JSON->phpexcel->excel+chart(line/pie/etc...)

    本系列《phpexcel图形图表》文章梗概如下:

    phpexcel图形图表(一)-入门----------------介绍PHPExcel类库和画图的基本步骤
    phpexcel图形图表(二)-图形----------------以最常用的line/pie/bar/radar图形为例作图,并对比和分析4种API
    phpexcel图形图表(三)-进阶----------------让图形美化,完成一些高级的效果
    phpexcel图形图表(三)-高级----------------PHPExcel能完成的图表相关的高级功能

    原创文章,转载请注明出处:http://www.cnblogs.com/phpgcs

    本篇文章梗概:
    1. 下载并研究PHPExcel仓库
    2. PHPExcel画图和普通数据处理的区别
    3. 注意事项总结

    phpgcs.com

    phpgcs
    首先最好是把PHPExcel的项目下载到本地来研究

    git clone git@github.com:PHPOffice/PHPExcel.git
    

    请先仔细阅读README.md说明文档,因为里面包含了很重要的版本信息,尤其是读写Excel文档的版本范围信息

    ### Reading
     * BIFF 5-8 (.xls) Excel 95 and above
     * Office Open XML (.xlsx) Excel 2007 and above
     * SpreadsheetML (.xml) Excel 2003
     * Open Document Format/OASIS (.ods)
     * Gnumeric
     * HTML
     * SYLK
     * CSV
    
    ### Writing
     * BIFF 8 (.xls) Excel 95 and above
     * Office Open XML (.xlsx) Excel 2007 and above
     * HTML
     * CSV
     * PDF (using either the tcPDF, DomPDF or mPDF libraries, which need to be installed separately)
    
    
    ## Requirements
     * PHP version 5.2.0 or higher
     * PHP extension php_zip enabled (required if you need PHPExcel to handle .xlsx .ods or .gnumeric files)
     * PHP extension php_xml enabled
     * PHP extension php_gd2 enabled (optional, but required for exact column width autocalculation)
    

      

    进入Examples文件夹,OhMygod,可以完成这么多的功能呀

    01pharSimple.php
    01simple-download-pdf.php
    01simple-download-xls.php
    01simple-download-xlsx.php
    01simplePCLZip.php
    01simple.php
    02types.php
    02types-xls.php
    03formulas.php
    04printing.php
    05featuredemo.inc.php
    05featuredemo.php
    06largescale.php
    06largescale-with-cellcaching.php
    06largescale-with-cellcaching-sqlite3.php
    06largescale-with-cellcaching-sqlite.php
    06largescale-xls.php
    07readerPCLZip.php
    07reader.php
    08conditionalformatting2.php
    08conditionalformatting.php
    09pagebreaks.php
    10autofilter.php
    10autofilter-selection-1.php
    10autofilter-selection-2.php
    10autofilter-selection-display.php
    11documentsecurity.php
    11documentsecurity-xls.php
    12cellProtection.php
    13calculation.php
    14excel5.php
    15datavalidation.php
    15datavalidation-xls.php
    16csv.php
    17html.php
    18extendedcalculation.php
    19namedrange.php
    20readexcel5.php
    21pdf.php
    22heavilyformatted.php
    23sharedstyles.php
    24readfilter.php
    25inmemoryimage.php
    26utf8.php
    27imagesexcel5.php
    28iterator.php
    29advancedvaluebinder.php
    30template.php
    31docproperties_write.php
    31docproperties_write-xls.php
    32chartreadwrite.php
    33chartcreate-area.php
    33chartcreate-bar.php
    33chartcreate-bar-stacked.php
    33chartcreate-column-2.php
    33chartcreate-column.php
    33chartcreate-composite.php
    33chartcreate-line.php
    33chartcreate-multiple-charts.php
    33chartcreate-pie.php
    33chartcreate-radar.php
    33chartcreate-scatter.php
    33chartcreate-stock.php
    34chartupdate.php
    35chartrender.php
    36chartreadwriteHTML.php
    36chartreadwritePDF.php
    37page_layout_view.php
    38cloneWorksheet.php
    40duplicateStyle.php
    Excel2003XMLReader.php
    Excel2003XMLTest.xml
    .gitignore
    GnumericReader.php
    GnumericTest.gnumeric
    images/
    list
    .~lock.33chartcreate-line.xlsx#
    OOCalcReaderPCLZip.php
    OOCalcReader.php
    OOCalcTest.ods
    Quadratic2.php
    Quadratic.php
    Quadratic.xlsx
    runall.php
    SylkReader.php
    SylkTest.slk
    templates/
    XMLReader.php
    XMLTest.xml
    

     

    好吧,这次的任务是chart,就先从 line chart 入手,相关的文件只有一个 ***line.php

    我们先直接运行一把:

    liuyuan@ebuinfo:/var/www/projects/PHPExcel/Examples$ php 33chartcreate-line.php 
    07:13:22 Write to Excel2007 format
    07:13:23 File written to 33chartcreate-line.xlsx
    07:13:23 Peak memory usage: 8.75 MB
    07:13:23 Done writing file
    File has been created in /var/www/projects/PHPExcel/Examples
    

      

    Wow,生成了一个Excel文件哦,赶紧打开

    phpexcel,chart,phpgcs

    这也太简单了吧,赶紧看看源码(附带说明)

    <?php
    
    /** 开启各种PHP Error Report机制 */
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);
    date_default_timezone_set('Europe/London');
    
    define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
    
    date_default_timezone_set('Europe/London');
    
    /** 引入最重要的PHPExcel类库的入口文件 */
    require_once dirname(__FILE__) . '/../Classes/PHPExcel.php';
    
    /* 创建PHPExcel对象 */
    $objPHPExcel = new PHPExcel();
    
    /* 其实最常用的操作是Excel的工作表sheet,因此我们取活动sheet对象 */
    $objWorksheet = $objPHPExcel->getActiveSheet();
    
    /* 画一个line图的源数据是一个2维数组,这样可以画多条line,即多个series */
    $objWorksheet->fromArray(
    	array(
    		array('',	2010,	2011,	2012),
    		array('Q1',   12,   15,		21),
    		array('Q2',   56,   73,		86),
    		array('Q3',   52,   61,		69),
    		array('Q4',   30,   32,		0),
    	)
    );
    
    /* 这里有一个重要的类PHPExcel_Chart_DataSeriesValues,后面多次用到,它有几个参数
     *
     * 数据类型  Datatype
     * 指定单元格  Cell reference for data
     * 格式代码 Format Code
     * 本系列数据中元素个数  Number of datapoints in series
     * Data values
     * Data
    */
    
    // 设置每一个data series 数据系列的名称
    $dataseriesLabels = array(
    	new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1),	//	2010
    	new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1),	//	2011
    	new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1),	//	2012
    );
    //	设置X轴Tick数据(X轴每一个刻度值)
    $xAxisTickValues = array(
    	new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4),	//	Q1 to Q4
    );
    //	设置作图区域数据
    $dataSeriesValues = array(
    	new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', NULL, 4),
    	new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4),
    	new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', NULL, 4),
    );
    
    //	构建数据系列 dataseries
    $series = new PHPExcel_Chart_DataSeries(
    	PHPExcel_Chart_DataSeries::TYPE_LINECHART,		// plotType
    	PHPExcel_Chart_DataSeries::GROUPING_STACKED,	// plotGrouping
    	range(0, count($dataSeriesValues)-1),			// plotOrder
    	$dataseriesLabels,								// plotLabel
    	$xAxisTickValues,								// plotCategory
    	$dataSeriesValues								// plotValues
    );
    
    // 给数据系列分配一个做图区域
    $plotarea = new PHPExcel_Chart_PlotArea(NULL, array($series));
    // Set the chart legend
    $legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false);
    
    // 设置图形标题
    $title = new PHPExcel_Chart_Title('Test Stacked Line Chart');
    // 设置Y轴标签
    $yAxisLabel = new PHPExcel_Chart_Title('Value ($k)');
    
    
    // 创建图形
    $chart = new PHPExcel_Chart(
    	'chart1',		// name
    	$title,			// title
    	$legend,		// legend
    	$plotarea,		// plotArea
    	true,			// plotVisibleOnly
    	0,				// displayBlanksAs
    	NULL,			// xAxisLabel
    	$yAxisLabel		// yAxisLabel
    );
    
    // 设置图形绘制区域
    $chart->setTopLeftPosition('A7');
    $chart->setBottomRightPosition('H20');
    
    // 将图形添加到当前工作表
    $objWorksheet->addChart($chart);
    
    
    // Save Excel 2007 file
    echo date('H:i:s') , " Write to Excel2007 format" , EOL;
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    // 打开做图开关
    $objWriter->setIncludeCharts(TRUE);
    $objWriter->save(str_replace('.php', '.xlsx', __FILE__));
    echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
    
    
    // Echo memory peak usage
    echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL;
    
    // Echo done
    echo date('H:i:s') , " Done writing file" , EOL;
    echo 'File has been created in ' , getcwd() , EOL;
    

      

    总结一下:

    1,引入PHPExcel
    2,填充源数据到工作表上
    	$objWorkSheet->fromArray($array);
    	or
    	$objWorkSheet->setCellValues('A1', 1);
    3,设置dataseries
    	PHPExcel_Chart_DataSeries::TYPE_LINECHART,
    	PHPExcel_Chart_DataSeries::GROUPING_STACKED,
    	range(0, count($dataSeriesValues)-1),
    	$dataseriesLabels=>array(new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$AB$1', NULL, 1)),
    	$xAxisTickValues=>array(new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$AA$2:$AA$21', NULL, 20),),
    	$dataSeriesValues=>array(new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$AB$2:$AB$21', NULL, 20))
    4,设置chart
    	'chartTitle'=>'just a title',
    	$title=>new PHPExcel_Chart_Title('新闻热点趋势'),
    	$legend=>new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false),
    	$plotarea=>new PHPExcel_Chart_PlotArea(NULL, array($series)),
    	'plotVisibleOnly'=>true,
    	'displayBlanksAs'=>0,
    	'xAxisLabel'=>NULL,
    	'yAxisLabel'=>new PHPExcel_Chart_Title('报道量'),
    5,设置chart位置
    	$chart->setTopLeftPosition('A1');                                                                                                                 
    	$chart->setBottomRightPosition('P20');
    6,添加chart
        $objWorksheet->addChart($chart);
    7,保存文件
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    	$objWriter->setIncludeCharts(TRUE);
    	$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
    

      

    很简单吧,跟PHP导出普通数据对比,就是多了chart的各种设置

    仔细想想,其实我们用PHPExcel API 这个设置的过程,跟我们直接在Excel中填充一个二维数组,然后插入图表的过程进行设置数据区域的过程是一样的

    原创文章,转载请注明出处:http://www.cnblogs.com/phpgcs

     

    最重要的2句话是:

    普通数据:

    $objWorkSheet->setCellValue('A1', 12345);
    

    图表:我们要先将源数据放到工作表上(可以用setCellValue ,也可以用fromArray),然后做图的时候调用这些数据所在的位置  

    $xAxisTickValues = array(
            new PHPExcel_Chart_DataSeriesValues('String', '图表分析!$AE$2:$AE$30', NULL, 30),
    );
    

      

    有几点需要注意的是:

    1,保存文件的格式 xlsx 以及 PHPExcel_IOFactory 调用的是 'Excel2007' 而不能是 'Excel5'  

    $filename = date('Y-m-d', time()).'_'.md5(time()).'.xlsx';
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
    

      

    另外只要是有chart,千万不能少了2行代码:

    $objWorksheet->addChart($chart4);
    
    $objWriter->setIncludeCharts(TRUE);
    

      

    2,调试的时候,如果报错

    Call to a member function cellExists() on a non-object /phpexcel/Classes/PHPExcel/Calculation.php on line 3241

    一般都是 getCellValue()失败, 请参看那篇blog

    3,PHPExcel_Chart_DataSeriesValues的第4个参数,是系列数据的个数,要等于确实存在的数据个数,如果开始不知道动态数据会填充几行,那就用变量,否则图形会有很多地方是无数据的状态,很不美观。

    之所以这样,因为Excel作图本来就是根据你指定的数据区域作图的,如果你指定了空的区域,那图形上也会表现出来的。

    $dataSeriesValues = array(
        new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$AB$2:$AB$21', NULL, 20),
     );
    

      

    最后研究下如何数据来源是JSON的情况,其实不就是JSON-->Array

    $arraydata = json_decode($jsondata, true);
    if($jsondata && $arraydata['status'] == 'success')
    {
           $arraydata = $arraydata['series'];
           $newarraydata[] = array('日期', '报道量');
           foreach($arraydata as $k=>$v)
           {
                  $newarraydata[] = array($k, $v);
             }
            $objPHPExcel->getActiveSheet()->setTitle('图表分析');
            $objWorksheet = $objPHPExcel->getActiveSheet();
            $objWorksheet->fromArray($newarraydata, NULL, 'AA1');
    .....
    

      

    END,下一篇再写写几种常用的chart API

    原创文章,转载请注明出处:http://www.cnblogs.com/phpgcs

  • 相关阅读:
    STM32低功耗模式与烟雾报警器触发信号电路设计
    cocos2d-x的环境的搭建
    window8.1中用户的管理员权限的提升方法
    cmd中目录的变更
    js的传值,table中tr的遍历,js中动态创建数组
    究竟什么是游戏引擎?
    大型网站架构学习心德
    关于listView 中的聚焦问题
    android6.0 适配的问题——activity销毁的问题
    文件发送成功率低的问题(2)
  • 原文地址:https://www.cnblogs.com/phpgcs/p/phpexcel_chart_1.html
Copyright © 2011-2022 走看看