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 会话(session 时间设定)使用入门代码
Jun 05 PHP
php结合表单实现一些简单功能的例子
Jun 04 PHP
php引用计数器进行垃圾收集机制介绍
Sep 19 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
php抽奖小程序的实现代码
Jun 18 PHP
怎么在Windows系统中搭建php环境
Aug 31 PHP
PHP内核探索:变量概述
Jan 30 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
php实现四舍五入的方法小结
Mar 03 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
php通过各种函数判断0和空
Jul 04 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
基于JS实现PHP的sprintf函数实例
2015/11/14 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
[07:25]DOTA2-DPC中国联赛2月5日Recap集锦
2021/03/11 DOTA
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
Python中subprocess模块用法实例详解
2015/05/20 Python
python编码最佳实践之总结
2016/02/14 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
打印tensorflow恢复模型中所有变量与操作节点方式
2020/05/26 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
linux面试相关问题
2013/04/28 面试题
给朋友的道歉信
2014/01/09 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
政府个人对照检查材料
2014/08/28 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers