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. ### Reading
  2. * BIFF 5-8 (.xls) Excel 95 and above
  3. * Office Open XML (.xlsx) Excel 2007 and above
  4. * SpreadsheetML (.xml) Excel 2003
  5. * Open Document Format/OASIS (.ods)
  6. * Gnumeric
  7. * HTML
  8. * SYLK
  9. * CSV
  10.  
  11. ### Writing
  12. * BIFF 8 (.xls) Excel 95 and above
  13. * Office Open XML (.xlsx) Excel 2007 and above
  14. * HTML
  15. * CSV
  16. * PDF (using either the tcPDF, DomPDF or mPDF libraries, which need to be installed separately)
  17.  
  18. ## Requirements
  19. * PHP version 5.2.0 or higher
  20. * PHP extension php_zip enabled (required if you need PHPExcel to handle .xlsx .ods or .gnumeric files)
  21. * PHP extension php_xml enabled
  22. * PHP extension php_gd2 enabled (optional, but required for exact column width autocalculation)

  

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

  1. 01pharSimple.php
  2. 01simple-download-pdf.php
  3. 01simple-download-xls.php
  4. 01simple-download-xlsx.php
  5. 01simplePCLZip.php
  6. 01simple.php
  7. 02types.php
  8. 02types-xls.php
  9. 03formulas.php
  10. 04printing.php
  11. 05featuredemo.inc.php
  12. 05featuredemo.php
  13. 06largescale.php
  14. 06largescale-with-cellcaching.php
  15. 06largescale-with-cellcaching-sqlite3.php
  16. 06largescale-with-cellcaching-sqlite.php
  17. 06largescale-xls.php
  18. 07readerPCLZip.php
  19. 07reader.php
  20. 08conditionalformatting2.php
  21. 08conditionalformatting.php
  22. 09pagebreaks.php
  23. 10autofilter.php
  24. 10autofilter-selection-1.php
  25. 10autofilter-selection-2.php
  26. 10autofilter-selection-display.php
  27. 11documentsecurity.php
  28. 11documentsecurity-xls.php
  29. 12cellProtection.php
  30. 13calculation.php
  31. 14excel5.php
  32. 15datavalidation.php
  33. 15datavalidation-xls.php
  34. 16csv.php
  35. 17html.php
  36. 18extendedcalculation.php
  37. 19namedrange.php
  38. 20readexcel5.php
  39. 21pdf.php
  40. 22heavilyformatted.php
  41. 23sharedstyles.php
  42. 24readfilter.php
  43. 25inmemoryimage.php
  44. 26utf8.php
  45. 27imagesexcel5.php
  46. 28iterator.php
  47. 29advancedvaluebinder.php
  48. 30template.php
  49. 31docproperties_write.php
  50. 31docproperties_write-xls.php
  51. 32chartreadwrite.php
  52. 33chartcreate-area.php
  53. 33chartcreate-bar.php
  54. 33chartcreate-bar-stacked.php
  55. 33chartcreate-column-2.php
  56. 33chartcreate-column.php
  57. 33chartcreate-composite.php
  58. 33chartcreate-line.php
  59. 33chartcreate-multiple-charts.php
  60. 33chartcreate-pie.php
  61. 33chartcreate-radar.php
  62. 33chartcreate-scatter.php
  63. 33chartcreate-stock.php
  64. 34chartupdate.php
  65. 35chartrender.php
  66. 36chartreadwriteHTML.php
  67. 36chartreadwritePDF.php
  68. 37page_layout_view.php
  69. 38cloneWorksheet.php
  70. 40duplicateStyle.php
  71. Excel2003XMLReader.php
  72. Excel2003XMLTest.xml
  73. .gitignore
  74. GnumericReader.php
  75. GnumericTest.gnumeric
  76. images/
  77. list
  78. .~lock.33chartcreate-line.xlsx#
  79. OOCalcReaderPCLZip.php
  80. OOCalcReader.php
  81. OOCalcTest.ods
  82. Quadratic2.php
  83. Quadratic.php
  84. Quadratic.xlsx
  85. runall.php
  86. SylkReader.php
  87. SylkTest.slk
  88. templates/
  89. XMLReader.php
  90. XMLTest.xml

 

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

我们先直接运行一把:

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

  

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

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

  1. <?php
  2.  
  3. /** 开启各种PHP Error Report机制 */
  4. error_reporting(E_ALL);
  5. ini_set('display_errors', TRUE);
  6. ini_set('display_startup_errors', TRUE);
  7. date_default_timezone_set('Europe/London');
  8.  
  9. define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
  10.  
  11. date_default_timezone_set('Europe/London');
  12.  
  13. /** 引入最重要的PHPExcel类库的入口文件 */
  14. require_once dirname(__FILE__) . '/../Classes/PHPExcel.php';
  15.  
  16. /* 创建PHPExcel对象 */
  17. $objPHPExcel = new PHPExcel();
  18.  
  19. /* 其实最常用的操作是Excel的工作表sheet,因此我们取活动sheet对象 */
  20. $objWorksheet = $objPHPExcel->getActiveSheet();
  21.  
  22. /* 画一个line图的源数据是一个2维数组,这样可以画多条line,即多个series */
  23. $objWorksheet->fromArray(
  24. array(
  25. array('', 2010, 2011, 2012),
  26. array('Q1', 12, 15, 21),
  27. array('Q2', 56, 73, 86),
  28. array('Q3', 52, 61, 69),
  29. array('Q4', 30, 32, 0),
  30. )
  31. );
  32.  
  33. /* 这里有一个重要的类PHPExcel_Chart_DataSeriesValues,后面多次用到,它有几个参数
  34. *
  35. * 数据类型 Datatype
  36. * 指定单元格 Cell reference for data
  37. * 格式代码 Format Code
  38. * 本系列数据中元素个数 Number of datapoints in series
  39. * Data values
  40. * Data
  41. */
  42.  
  43. // 设置每一个data series 数据系列的名称
  44. $dataseriesLabels = array(
  45. new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), // 2010
  46. new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011
  47. new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 2012
  48. );
  49. // 设置X轴Tick数据(X轴每一个刻度值)
  50. $xAxisTickValues = array(
  51. new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4
  52. );
  53. // 设置作图区域数据
  54. $dataSeriesValues = array(
  55. new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', NULL, 4),
  56. new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4),
  57. new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', NULL, 4),
  58. );
  59.  
  60. // 构建数据系列 dataseries
  61. $series = new PHPExcel_Chart_DataSeries(
  62. PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType
  63. PHPExcel_Chart_DataSeries::GROUPING_STACKED, // plotGrouping
  64. range(0, count($dataSeriesValues)-1), // plotOrder
  65. $dataseriesLabels, // plotLabel
  66. $xAxisTickValues, // plotCategory
  67. $dataSeriesValues // plotValues
  68. );
  69.  
  70. // 给数据系列分配一个做图区域
  71. $plotarea = new PHPExcel_Chart_PlotArea(NULL, array($series));
  72. // Set the chart legend
  73. $legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false);
  74.  
  75. // 设置图形标题
  76. $title = new PHPExcel_Chart_Title('Test Stacked Line Chart');
  77. // 设置Y轴标签
  78. $yAxisLabel = new PHPExcel_Chart_Title('Value ($k)');
  79.  
  80. // 创建图形
  81. $chart = new PHPExcel_Chart(
  82. 'chart1', // name
  83. $title, // title
  84. $legend, // legend
  85. $plotarea, // plotArea
  86. true, // plotVisibleOnly
  87. 0, // displayBlanksAs
  88. NULL, // xAxisLabel
  89. $yAxisLabel // yAxisLabel
  90. );
  91.  
  92. // 设置图形绘制区域
  93. $chart->setTopLeftPosition('A7');
  94. $chart->setBottomRightPosition('H20');
  95.  
  96. // 将图形添加到当前工作表
  97. $objWorksheet->addChart($chart);
  98.  
  99. // Save Excel 2007 file
  100. echo date('H:i:s') , " Write to Excel2007 format" , EOL;
  101. $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
  102. // 打开做图开关
  103. $objWriter->setIncludeCharts(TRUE);
  104. $objWriter->save(str_replace('.php', '.xlsx', __FILE__));
  105. echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
  106.  
  107. // Echo memory peak usage
  108. echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL;
  109.  
  110. // Echo done
  111. echo date('H:i:s') , " Done writing file" , EOL;
  112. echo 'File has been created in ' , getcwd() , EOL;

  

总结一下:

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

  

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

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

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

最重要的2句话是:

普通数据:

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

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

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

  

有几点需要注意的是:

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

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

  

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

  1. $objWorksheet->addChart($chart4);
  2.  
  3. $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作图本来就是根据你指定的数据区域作图的,如果你指定了空的区域,那图形上也会表现出来的。

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

  

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

  1. $arraydata = json_decode($jsondata, true);
  2. if($jsondata && $arraydata['status'] == 'success')
  3. {
  4. $arraydata = $arraydata['series'];
  5. $newarraydata[] = array('日期', '报道量');
  6. foreach($arraydata as $k=>$v)
  7. {
  8. $newarraydata[] = array($k, $v);
  9. }
  10. $objPHPExcel->getActiveSheet()->setTitle('图表分析');
  11. $objWorksheet = $objPHPExcel->getActiveSheet();
  12. $objWorksheet->fromArray($newarraydata, NULL, 'AA1');
  13. .....

  

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

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

phpexcel图形图表(一)入门的更多相关文章

  1. phpexcel图形图表(二)图形

    原创文章,转载请注明出处:http://www.cnblogs.com/phpgcs 本篇文章实例演示如上图,画3种图形以及多sheet操作等 先回忆下第一篇中line图形的API调用步骤: 1,引入 ...

  2. PHPExcel中文开发手册翻译版(2)

    2016年8月18日12:45:14 请注意这个是粗翻译版,仅供参考,不是精校版 精校版后面才会更新 PHPExcel开发者文档 1.目录 2. 4先决条件 2.1.软件要求4 2.2.安装说明4 2 ...

  3. php:PHPExcel导出excel表格

    一.动态生成的内容如何能当成文件来下载呢? 方法:1.将Content-Type设置成application/octet-stream就可以了,即[header('Content-Type: appl ...

  4. 【php】对PHPExcel一些简单的理解

    这里有关于excel文件的几个概念需要跟大家说明一下,这几个概念对于我们的后续编程是很有帮助的:1.工作簿:在excel环境中用来存储数据并处理数据的文件,又称为excel文件或excel文档,   ...

  5. Composer入门

    摘要 本文介绍Composer的入门知识,包括require和autoload部分. Java有Maven, Node.js有npm, ROR有gem, 这些语言的程序员在开心地使用包管理工具加速开发 ...

  6. phpspreadsheet 中文文档(五)节约内存+PHPExcel迁移

    2019年10月11日14:03:31 节省内存 PhpSpreadsheet在工作表中平均每个单元格使用约1k,因此大型工作簿可以迅速用尽可用内存.单元缓存提供了一种机制,使PhpSpreadshe ...

  7. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  8. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  9. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

随机推荐

  1. jQuery 移除绑定事件

    移除事件 unbind(type [,data])     //data是要移除的函数 $('#btn').unbind("click"); //移除click $('#btn') ...

  2. Java杂谈2——引用与跟搜索算法

    Java中的引用 Java“引用”的概念源于C++,原本的定义相当有限:一个引用(Reference)代表的内存通常用于指向另一块内存区域的起始地址.通过引用类型保存的起始地址,可以找到这个引用所指向 ...

  3. MySQL第三方客户端工具

    如前所述,MySQL是一个基于客户机--服务器的DBMS,因此,为了使用MySQl,你需要有一个客户机软件给MySQL提供要执行的命令.即你需要一个编写和测试MySQL脚本的工具. 1.MySQL命令 ...

  4. 使用Spring Boot上传文件

    原文:http://www.cnblogs.com/ityouknow/p/8298344.html 上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个Spri ...

  5. win8.1无法安装安装.net framework 3.5 解决办法【转】

    安装流程1.以系统管理员开启命令提示符(命令提示字符)2挂载windows8.1异3,在命令提示符下输入Dism /online /enablefeature/featurename:NetFx3 / ...

  6. 页面自动适应大小&&获取页面的大小

    直接上代码: <script type="text/JavaScript"> var size = 1.0; function showheight() { alert ...

  7. easyui dialog 按钮动态命名

    1.方法一: /** * grid新增 * 弹框并且获取支付类型 */ function gridAdd() { var dlg = $('#mydialog').dialog({ title : & ...

  8. 关于constraint 的disable和enable

    建立主外键的constraint create table emp1(emp_no number(2) constraint emp_emp_no_pk primary key,ename varch ...

  9. javascript设定指定元素的父结点的孙子节点的属性

    window.onload=function(){ var allerror_a = document.getElementsByClassName("popup_link"); ...

  10. POJ3264 Balanced Lineup 【线段树】+【单点更新】

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 32778   Accepted: 15425 ...