基于PHPexecl类生成复杂的报表表头示例


Posted in PHP onOctober 14, 2016

本文实例讲述了基于PHPexecl类生成复杂的报表表头。分享给大家供大家参考,具体如下:

以前一直有需求,能把Execl里面的数据导入数据库,并且把数据库里面的数据导出到Execl中。

require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php';
class PHPExeclCore extends PHPExcel_IOFactory{
 public static function SummerCreateExecl($Head,$data)
 {
 self::SummerCreateExeclHead($Head,$data,"Excel2007");
 }
 public static function SummerReadExecl($dir)
 {
 if(!file_exists($dir))
 {
 echo "Execl Not Exist";
 }
 else
 {
 $PHPExeclObj = self::load($dir);
 $sheetCount = $PHPExeclObj->getSheetCount(); //得到Execl中包含的Sheet工作簿的数量
 for($i=0;$i<$sheetCount;$i++)
 {
 $ActiveSheet = $PHPExeclObj->getSheet($i);
 $highestRow = $ActiveSheet->getHighestRow(); // 取得总列数
 $allColumn = $ActiveSheet->getHighestColumn();
 //通过嵌套循环来读取sheet工作簿里面的内容
 for($Col='A';$Col<$allColumn;$Col++)
 {
 for($Row=1;$Row<$highestRow;$Row++)
 {
 $Data[$Col][$Row] = $ActiveSheet->getCell($Col.$Row)->getValue();
 }
 }
 }
 }
 return $Data;
 }
 /*
 * 将数据写入到数据表中
 * $Data Array 表示要插入进Execl数据
 * $RuleData Array 表示数据格式的规则数组
 * $i int 表示从第几行起的插入数据
 * **/
 public static function SummerInsertDateToExecl($sheet,$Head,$Data,$n=3,$RuleData=array())
 {
 $SimpleHead = self::getHead($Head);
 $row = $n;
 foreach($Data as $key=>$valueArr)
 {
 $m = 0;
 foreach($valueArr as $k=>$v)
 {
 $StartCol = PHPExcel_Cell::stringFromColumnIndex($m).$row;
 $sheet->getCell($StartCol)->setValue($v);
 $sheet->getStyle($StartCol)->getAlignment()->applyFromArray(
 array(
 'horizontal'=> PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
 'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
 'rotation' => 0,
 'wrap' => TRUE,
 )
 );
 if(isset($SimpleHead[$k]['col']))
 {
 $m = $m + $SimpleHead[$k]['col']-1;
 $endCol = PHPExcel_Cell::stringFromColumnIndex($m).$row;
 $sheet->mergeCells($StartCol.":".$endCol);
 }
 $m++;
 $type = false;
 if(isset($SimpleHead[$k]['type']))
 {
 $type = $SimpleHead[$k]['type'];
 $AllowArray = $SimpleHead[$k]['allowarray'];
 }
 //设置单元格的数据验证
 if($type)
 {
 switch ($type)
 {
 case 'list':
 self::setSelectionRange($sheet, $StartCol,$AllowArray);
 break;
 case 'range':
 self::setValueRange($sheet, $StartCol,$AllowArray);
 break;
 }
 }
 }
 $row ++ ;
 }
 }
 /*
 * 生成Execl单元格备注
 * $sheet 当前的工作簿对象
 * $Cell 需要设置属性的单元格
 * $content 备注内容
 * */
 private static function setComment($sheet,$Cell,$content)
 {
 $sheet->getComment($Cell)->setAuthor('4399om');
 $objCommentRichText = $sheet->getComment($Cell)->getText()->createTextRun('4399om:');
 $objCommentRichText->getFont()->setBold(true);
 $sheet->getComment($Cell)->getText()->createTextRun("\r\n");
 $sheet->getComment($Cell)->getText()->createTextRun($content);
 $sheet->getComment($Cell)->setWidth('100pt');
 $sheet->getComment($Cell)->setHeight('100pt');
 $sheet->getComment($Cell)->setMarginLeft('150pt');
 $sheet->getComment($Cell)->getFillColor()->setRGB('EEEEEE');
 }
 /*
 * 现在单元格的有效数据范围,暂时仅限于数字
 * $sheet 当前的工作簿对象
 * $Cell 需要设置属性的单元格
 * $ValueRange array 允许输入数组的访问
 */
 private static function setValueRange($sheet,$Cell,$ValueRange)
 {
 //设置单元格的的数据类型是数字,并且保留有效位数
 $sheet->getStyle($Cell)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00);
 $ValueRange = explode(",",$ValueRange);
 //开始数值有效访问设定
 $objValidation = $sheet->getCell($Cell)->getDataValidation();
 $objValidation->setType( PHPExcel_Cell_DataValidation:: TYPE_WHOLE );
 $objValidation->setErrorStyle( PHPExcel_Cell_DataValidation:: STYLE_STOP );
 $objValidation->setAllowBlank(true);
 $objValidation->setShowInputMessage( true); //设置显示提示信息
 $objValidation->setShowErrorMessage( true); //设置显示错误信息
 $objValidation->setErrorTitle('输入错误'); //错误标题
 $objValidation->setError('请输入数据范围在从'.$ValueRange[0].'到'.$ValueRange[1].'之间的所有值'); //错误内容
 $objValidation->setPromptTitle('允许输入'); //设置提示标题
 $objValidation->setPrompt('请输入数据范围在从'.$ValueRange[0].'到'.$ValueRange[1].'之间的所有值'); //提示内容
 $objValidation->setFormula1($ValueRange['0']); //设置最大值
 $objValidation->setFormula2($ValueRange['1']); //设置最小值
 }
 private static function OutinputHeader($objWriter)
 {
 $fileName = str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME));
 header("Content-Type: application/force-download");
 header("Content-Type: application/octet-stream");
 header("Content-Type: application/download");
 header('Content-Disposition:inline;filename="'.$fileName.'"');
 header("Content-Transfer-Encoding: binary");
 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
 header("Pragma: no-cache");
 $objWriter->save('php://output');
 exit;
 }
 //数据控制,设置单元格数据在一个可选方位类
 private static function setSelectionRange($sheet,$Cell,$rangeStr,$Title="数据类型")
 {
 $objValidation = $sheet->getCell($Cell)->getDataValidation();
 $objValidation -> setType(PHPExcel_Cell_DataValidation::TYPE_LIST)
 -> setErrorStyle(PHPExcel_Cell_DataValidation::STYLE_STOP)
 -> setAllowBlank(true)
 -> setShowInputMessage(true)
 -> setShowErrorMessage(true)
 -> setShowDropDown(true)
 -> setErrorTitle('输入的值有误')
 -> setError('您输入的值不在下拉框列表内.')
 -> setPromptTitle('"'.$Title.'"')
 -> setFormula1('"'.$rangeStr.'"');
 }
 /*
 * 构建表头
 * */
 public static function RecursionCreateExecl($head,$data)
 {
 $PHPExecl = new PHPExcel();
 $objWriter = self::createWriter($PHPExecl, 'Excel2007');
 $PHPExecl->getProperties()->setCreator("4399om")
 ->setLastModifiedBy("Summer")
 ->setTitle("Office 2007 XLSX Test Document")
 ->setSubject("Office 2007 XLSX Test Document")
 ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
 ->setKeywords("office 2007 openxml php")
 ->setCategory("Test result file");
 $PHPExecl->setActiveSheetIndex(0);
 $sheet = $PHPExecl->getActiveSheet();
 self::HandleHeadToNode($sheet, $head,1,0,0);
 self::SummerInsertDateToExecl($sheet,$head,$data,4);
 self::OutinputHeader($objWriter);
 }
 private static function HandleHeadToNode($sheet,$Head,$beginRow,$col,$StartCol)
 {
 foreach($Head as $key=>$cells)
 {
 $row = $beginRow; //表示行
 $beginCol = PHPExcel_Cell::stringFromColumnIndex($col).$row;
 $sheet->getCell($beginCol)->setValue($cells['value']);
 //设置表格样式
 $sheet->getStyle($beginCol)->getAlignment()->applyFromArray(
 array(
 'horizontal'=> PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
 'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
 'rotation' => 0,
 'wrap' => TRUE,
 )
 );
 $sheet->getStyle($beginCol)->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_DARKGREEN);
 //设置单元格的宽度
 if(isset($cells['width']))
 {
 $Cell = $sheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($col));
 $Cell->setWidth($cells['width']);
 }
 //哥元素打上标记
 if(isset($cells['Content']))
 {
 self::setComment($sheet, $beginCol, $cells['Content']);
 }
 $merge = false; //合并单元格
 if(isset($cells['col']))
 {
 $col += $cells['col']-1;
 $merge = true;
 }
 if(isset($cells['row']))
 {
 $row += $cells['row']-1;
 $merge = true;
 }
 if($merge)
 {
 $endCol = PHPExcel_Cell::stringFromColumnIndex($col).$row;
 $sheet->mergeCells($beginCol.":".$endCol);
 }
 $row ++;
 $col ++;
 //表示有存在孩子节点
 if(isset($cells['children']) && is_array($cells['children'])){
 $cols = $StartCol;
 if(!self::IsExistChildren($cells['children']))
 {
 $cols = $col-2;
 $StartCol = $col;
 }
 self::HandleHeadToNode($sheet,$cells['children'],$row,$cols,$StartCol);
 }else{
 $StartCol = $col;
 }
 }
 }
 //判断自己的孩子节点中是否存在孙子节点
 private static function IsExistChildren($Data)
 {
 foreach($Data as $key=>$value)
 {
 if(isset($value['children']) && is_array($value['children']))
 {
 return true;
 }
 }
 return false;
 }
 //获取底层数据
 private static function getHead($Head,&$Node=array())
 {
 foreach($Head as $key=>$value)
 {
 if(isset($value['children']) && is_array($value['children']))
 {
 self::getHead($value['children'],$Node);
 }
 else
 {
 $Node[] = $value;
 }
 }
 return $Node;
 }
}
$Head = array(
 array('value'=>'姓名','col'=>2,'row'=>2,'width'=>20,'type'=>'list','allowarray'=>'PHP开发工程师,PHP开发'),
 array('value'=>'第一天','col'=>2,'row'=>1,'width'=>20,'Content'=>'2014-12-29号',
 'children'=>
 array(
 array('value'=>'上午','col'=>1,'width'=>20,'type'=>'range','allowarray'=>'10,100'),
 array('value'=>'下午','width'=>20),
 ),
 ),
 array('value'=>'第二天','col'=>2,'row'=>1,'width'=>20,
 'children'=>
 array(
 array('value'=>'上午','width'=>20),
 array('value'=>'下午','width'=>20),
 ),
 ),
);
$data = array(
 array('PHP开发工程师','12','吃饭1','睡觉1','起床刷牙2','吃饭睡觉2'),
 array('PHP开发工程师','25','吃饭1','睡觉1','起床刷牙2','吃饭睡觉2'),
 array('PHP开发工程师','50','吃饭1','睡觉1','起床刷牙2','吃饭睡觉2'),
 array('PHP开发工程师','99','吃饭1','睡觉1','起床刷牙2','吃饭睡觉2'),
 array('PHP开发工程师','10','吃饭1','睡觉1','起床刷牙2','吃饭睡觉2'),
 );
$Node = PHPExeclCore::RecursionCreateExecl($Head,$data);

得到的效果也基本符合需求:

基于PHPexecl类生成复杂的报表表头示例

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
mysql 搜索之简单应用
Apr 27 PHP
PHP 引用是个坏习惯
Mar 12 PHP
ThinkPHP与PHPExcel冲突解决方法
Aug 08 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
Apr 24 PHP
简单的php缓存类分享     php缓存机制
Jan 22 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
php实现文本数据导入SQL SERVER
May 17 PHP
jquery获取多个checkbox的值异步提交给php的方法
Jun 24 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
phpStudy vscode 搭建debug调试的教程详解
Jul 28 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
Dec 16 PHP
php+jQuery递归调用POST循环请求示例
Oct 14 #PHP
php实现将HTML页面转换成word并且保存的方法
Oct 14 #PHP
PHP中多线程的两个实现方法
Oct 14 #PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
Oct 14 #PHP
PHP面向对象自动加载机制原理与用法分析
Oct 14 #PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 #PHP
PHP 将dataurl转成图片image方法总结
Oct 14 #PHP
You might like
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
php下使用无限生命期Session的方法
2007/03/16 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
smarty中常用方法实例总结
2015/08/07 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
为数据添加append,remove功能
2006/10/03 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
js正则相关知识点专题
2018/05/10 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
Python中subprocess模块用法实例详解
2015/05/20 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
Django中的Model操作表的实现
2018/07/24 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
美味咖啡的顶级烘焙师:Cafe Britt
2018/03/15 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
通信工程专业女生个人求职信
2013/09/21 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
毕业生入职感言
2015/07/31 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python