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的项目下载到本地来研究
- 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文件哦,赶紧打开
这也太简单了吧,赶紧看看源码(附带说明)
- <?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,调试的时候,如果报错
一般都是 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
phpexcel图形图表(一)入门的更多相关文章
- phpexcel图形图表(二)图形
原创文章,转载请注明出处:http://www.cnblogs.com/phpgcs 本篇文章实例演示如上图,画3种图形以及多sheet操作等 先回忆下第一篇中line图形的API调用步骤: 1,引入 ...
- PHPExcel中文开发手册翻译版(2)
2016年8月18日12:45:14 请注意这个是粗翻译版,仅供参考,不是精校版 精校版后面才会更新 PHPExcel开发者文档 1.目录 2. 4先决条件 2.1.软件要求4 2.2.安装说明4 2 ...
- php:PHPExcel导出excel表格
一.动态生成的内容如何能当成文件来下载呢? 方法:1.将Content-Type设置成application/octet-stream就可以了,即[header('Content-Type: appl ...
- 【php】对PHPExcel一些简单的理解
这里有关于excel文件的几个概念需要跟大家说明一下,这几个概念对于我们的后续编程是很有帮助的:1.工作簿:在excel环境中用来存储数据并处理数据的文件,又称为excel文件或excel文档, ...
- Composer入门
摘要 本文介绍Composer的入门知识,包括require和autoload部分. Java有Maven, Node.js有npm, ROR有gem, 这些语言的程序员在开心地使用包管理工具加速开发 ...
- phpspreadsheet 中文文档(五)节约内存+PHPExcel迁移
2019年10月11日14:03:31 节省内存 PhpSpreadsheet在工作表中平均每个单元格使用约1k,因此大型工作簿可以迅速用尽可用内存.单元缓存提供了一种机制,使PhpSpreadshe ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
随机推荐
- jQuery 移除绑定事件
移除事件 unbind(type [,data]) //data是要移除的函数 $('#btn').unbind("click"); //移除click $('#btn') ...
- Java杂谈2——引用与跟搜索算法
Java中的引用 Java“引用”的概念源于C++,原本的定义相当有限:一个引用(Reference)代表的内存通常用于指向另一块内存区域的起始地址.通过引用类型保存的起始地址,可以找到这个引用所指向 ...
- MySQL第三方客户端工具
如前所述,MySQL是一个基于客户机--服务器的DBMS,因此,为了使用MySQl,你需要有一个客户机软件给MySQL提供要执行的命令.即你需要一个编写和测试MySQL脚本的工具. 1.MySQL命令 ...
- 使用Spring Boot上传文件
原文:http://www.cnblogs.com/ityouknow/p/8298344.html 上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个Spri ...
- win8.1无法安装安装.net framework 3.5 解决办法【转】
安装流程1.以系统管理员开启命令提示符(命令提示字符)2挂载windows8.1异3,在命令提示符下输入Dism /online /enablefeature/featurename:NetFx3 / ...
- 页面自动适应大小&&获取页面的大小
直接上代码: <script type="text/JavaScript"> var size = 1.0; function showheight() { alert ...
- easyui dialog 按钮动态命名
1.方法一: /** * grid新增 * 弹框并且获取支付类型 */ function gridAdd() { var dlg = $('#mydialog').dialog({ title : & ...
- 关于constraint 的disable和enable
建立主外键的constraint create table emp1(emp_no number(2) constraint emp_emp_no_pk primary key,ename varch ...
- javascript设定指定元素的父结点的孙子节点的属性
window.onload=function(){ var allerror_a = document.getElementsByClassName("popup_link"); ...
- POJ3264 Balanced Lineup 【线段树】+【单点更新】
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 32778 Accepted: 15425 ...