Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】


Posted in PHP onJuly 24, 2019

本文实例讲述了Yii框架使用PHPExcel导出Excel文件的方法。分享给大家供大家参考,具体如下:

最近在研究PHP的Yii框架,很喜欢,碰到导出Excel的问题,研究了一下,就有了下面的方法:

1、首先在config\main.php中添加对PHPExcel的引用,我的方式是这样:

// autoloading model and component classes
'import'=>array(
    /*'application.modules.srbac.controllers.SBaseController',*/
    'application.models.*',
    'application.components.*',
    'application.extensions.phpexcel.*',
),

另外也有人用components 这个配置,但是我的有问题,所以就用上面的方法。

2、按照下面的代码修改PHPExcel代码目录里的Autoloader.php文件:

public static function Register() {
    /*if (function_exists('__autoload')) {
      //  Register any existing autoloader function with SPL, so we don't get any clashes
      spl_autoload_register('__autoload');
    }
    //  Register ourselves with SPL
    return spl_autoload_register(array('PHPExcel_Autoloader', 'Load'));*/
    $functions = spl_autoload_functions();
      foreach ( $functions as $function)
        spl_autoload_unregister($function);
      $functions = array_merge(array(array('PHPExcel_Autoloader','Load')),$functions);
      foreach ( $functions as $function)
        $x = spl_autoload_register($function);
      return $x;
}  //  function Register()

上面的函数中,注释掉的是原有的代码。

3、下面的代码是输出Excel,以及一些常用的属性设置,在你的controller中:

/*
导出为Excel
*/
public function actionExport()
{
    $objectPHPExcel = new PHPExcel();
    $objectPHPExcel->setActiveSheetIndex(0);
    $page_size = 52;
    //数据的取出
    $model = Yii::app()->session['printdata'];
    $dataProvider = $model->search();
    $dataProvider->setPagination(false);
    $data = $dataProvider->getData();
    $count = $dataProvider->getTotalItemCount();
    //总页数的算出
    $page_count = (int)($count/$page_size) +1;
    $current_page = 0;
    $n = 0;
    foreach ( $data as $product )
    {
      if ( $n % $page_size === 0 )
      {
        $current_page = $current_page +1;
        //报表头的输出
        $objectPHPExcel->getActiveSheet()->mergeCells('B1:G1');
        $objectPHPExcel->getActiveSheet()->setCellValue('B1','产品信息表');
        $objectPHPExcel->setActiveSheetIndex(0)->setCellValue('B2','产品信息表');
        $objectPHPExcel->setActiveSheetIndex(0)->setCellValue('B2','产品信息表');
        $objectPHPExcel->setActiveSheetIndex(0)->getStyle('B1')->getFont()->setSize(24);
        $objectPHPExcel->setActiveSheetIndex(0)->getStyle('B1')
          ->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objectPHPExcel->setActiveSheetIndex(0)->setCellValue('B2','日期:'.date("Y年m月j日"));
        $objectPHPExcel->setActiveSheetIndex(0)->setCellValue('G2','第'.$current_page.'/'.$page_count.'页');
        $objectPHPExcel->setActiveSheetIndex(0)->getStyle('G2')
          ->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
        //表格头的输出
        $objectPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(5);
        $objectPHPExcel->setActiveSheetIndex(0)->setCellValue('B3','编号');
        $objectPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(6.5);
        $objectPHPExcel->setActiveSheetIndex(0)->setCellValue('C3','名称');
        $objectPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(17);
        $objectPHPExcel->setActiveSheetIndex(0)->setCellValue('D3','生产厂家');
        $objectPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(22);
        $objectPHPExcel->setActiveSheetIndex(0)->setCellValue('E3','单位');
        $objectPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(15);
        $objectPHPExcel->setActiveSheetIndex(0)->setCellValue('F3','单价');
        $objectPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(15);
        $objectPHPExcel->setActiveSheetIndex(0)->setCellValue('G3','在库数');
        $objectPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(15);
        //设置居中
        $objectPHPExcel->getActiveSheet()->getStyle('B3:G3')
          ->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        //设置边框
        $objectPHPExcel->getActiveSheet()->getStyle('B3:G3' )
          ->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
        $objectPHPExcel->getActiveSheet()->getStyle('B3:G3' )
          ->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
        $objectPHPExcel->getActiveSheet()->getStyle('B3:G3' )
          ->getBorders()->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
        $objectPHPExcel->getActiveSheet()->getStyle('B3:G3' )
          ->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
        $objectPHPExcel->getActiveSheet()->getStyle('B3:G3' )
          ->getBorders()->getVertical()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
        //设置颜色
        $objectPHPExcel->getActiveSheet()->getStyle('B3:G3')->getFill()
          ->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FF66CCCC');
      }
      //明细的输出
      $objectPHPExcel->getActiveSheet()->setCellValue('B'.($n+4) ,$product->id);
      $objectPHPExcel->getActiveSheet()->setCellValue('C'.($n+4) ,$product->product_name);
      $objectPHPExcel->getActiveSheet()->setCellValue('D'.($n+4) ,$product->product_agent->name);
      $objectPHPExcel->getActiveSheet()->setCellValue('E'.($n+4) ,$product->unit);
      $objectPHPExcel->getActiveSheet()->setCellValue('F'.($n+4) ,$product->unit_price);
      $objectPHPExcel->getActiveSheet()->setCellValue('G'.($n+4) ,$product->library_count);
      //设置边框
      $currentRowNum = $n+4;
      $objectPHPExcel->getActiveSheet()->getStyle('B'.($n+4).':G'.$currentRowNum )
          ->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
      $objectPHPExcel->getActiveSheet()->getStyle('B'.($n+4).':G'.$currentRowNum )
          ->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
      $objectPHPExcel->getActiveSheet()->getStyle('B'.($n+4).':G'.$currentRowNum )
          ->getBorders()->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
      $objectPHPExcel->getActiveSheet()->getStyle('B'.($n+4).':G'.$currentRowNum )
          ->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
      $objectPHPExcel->getActiveSheet()->getStyle('B'.($n+4).':G'.$currentRowNum )
          ->getBorders()->getVertical()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
      $n = $n +1;
    }
    //设置分页显示
    //$objectPHPExcel->getActiveSheet()->setBreak( 'I55' , PHPExcel_Worksheet::BREAK_ROW );
    //$objectPHPExcel->getActiveSheet()->setBreak( 'I10' , PHPExcel_Worksheet::BREAK_COLUMN );
    $objectPHPExcel->getActiveSheet()->getPageSetup()->setHorizontalCentered(true);
    $objectPHPExcel->getActiveSheet()->getPageSetup()->setVerticalCentered(false);
    ob_end_clean();
    ob_start();
    header('Content-Type : application/vnd.ms-excel');
    header('Content-Disposition:attachment;filename="'.'产品信息表-'.date("Y年m月j日").'.xls"');
    $objWriter= PHPExcel_IOFactory::createWriter($objectPHPExcel,'Excel5');
    $objWriter->save('php://output');
}

代码执行后,会直接生成Excel,并提示下载或打开。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
我用php+mysql写的留言本
Oct 09 PHP
PHP 伪静态隐藏传递参数名的四种方法
Feb 22 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 PHP
php制作中间带自己定义图片二维码的方法
Jan 27 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
php截取指定2个字符之间字符串的方法
Apr 15 PHP
PHP stream_context_create()函数的使用示例
May 12 PHP
Yii统计不同类型邮箱数量的方法
Oct 18 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 #PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 #PHP
PHP容器类的两种实现方式示例
Jul 24 #PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
Jul 24 #PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 #PHP
Thinkphp5 自定义上传文件名的实现方法
Jul 23 #PHP
PHP中__set()实例用法和基础讲解
Jul 23 #PHP
You might like
基于文本的访客签到簿
2006/10/09 PHP
PHP 文件上传源码分析(RFC1867)
2009/10/30 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
JavaScript 程序编码规范
2010/11/23 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
2016/12/19 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
Python进行数据科学工作的简单入门教程
2015/04/01 Python
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
python八大排序算法速度实例对比
2017/12/06 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
Python 对输入的数字进行排序的方法
2018/06/23 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
python实现图片二值化及灰度处理方式
2019/12/07 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
2020/02/18 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
一些Unix笔试题和面试题
2013/01/22 面试题
运动会邀请函范文
2014/02/06 职场文书
学校运动会报道稿
2014/09/23 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL