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

posted @ 2014-02-18 18:02  phpgcs  阅读(8867)  评论(3编辑  收藏  举报