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. 注意事项总结


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
### 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,可以完成这么多的功能呀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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

我们先直接运行一把:

1
2
3
4
5
6
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图形图表(一)入门

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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

 phpexcel图形图表(一)入门

 

最重要的2句话是:

普通数据:

1
$objWorkSheet->setCellValue(‘A1‘, 12345);

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

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

  

有几点需要注意的是:

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

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

  

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作图本来就是根据你指定的数据区域作图的,如果你指定了空的区域,那图形上也会表现出来的。

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

  

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
$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

phpexcel图形图表(一)入门

上一篇:javascript库之Mustache库使用说明


下一篇:几个比较好的countdown js