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 相关文章推荐
建立动态的WML站点(一)
Oct 09 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
php strrpos()与strripos()函数
Aug 31 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
Nov 20 PHP
php输出金字塔的2种实现方法
Dec 16 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
Sep 30 PHP
在WordPress的文章编辑器中设置默认内容的方法
Dec 29 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
php base64 编码与解码实例代码
Mar 21 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
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
初步解析Python下的多进程编程
2015/04/28 Python
python将unicode转为str的方法
2017/06/21 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
python按比例随机切分数据的实现
2019/07/11 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
python检测服务器端口代码实例
2019/08/31 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
艺术系应届生的自我评价
2013/10/19 职场文书
平面设计师工作职责范文
2013/12/03 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
企业年检委托书范本
2014/10/14 职场文书
创先争优个人总结
2015/03/04 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
创业计划书详解
2019/07/19 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL