水蓝儿 2017-06-04 01:02:10 6024次浏览 1条评论 8 0 0

最近在做导出功能,网上提高的资料都是用PHPExcel来做,这个扩展确实非常好用,
但是每次导出时都要写大量重复代码,很麻烦,为此,基于PHPExcel 封装了一个新的方法来做导出。

第一步:引入PHPExcel
首先得要下载phpexcel地址:https://github.com/PHPOffice/PHPExcel/archive/1.8.1.zip
其次,引入,直接在入口文件index.php中引入,也可以在你定义的controller类之前,只要是在你使用之前引入就可以
require dirname(dirname(FILE)).'/excel/PHPExcel.php';
或者在phpexcel类里修改相应的namespace也可。

第二步:按照下面的代码修改PHPExcel代码目录里的Autoloader.php文件,对比源文件改成

public static function Register() {
$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;
 }

第三步:基于PHPExcel封装导出方法
我把这个文件放在了extensions/putoutExcel.php 目录下,不知道是否是最佳位置。
文件内容如下:

class PutoutExcel{
  public function __construct(){
     Yii::import("application.extensions.PHPExcel.PHPExcel",1);
 }
/*
*  导出方法,其中参数$data :要导出的数据二维数组,$filename:导出的excel的文件名,$pathname:导出文件存放的路径
*/
public  function exportExcel($data,$filename,$pathname='export'){
   $path=Yii::app()->params['tmp_dir'].$pathname.'/'; //下载文件的存放位置
   if(!is_dir($path)){
   mkdir($path);
   }

    $filename = $filename?$filename:(time().rand(1, 10).'.xls');
    $fileurl=$path.$filename;
    
    $objPHPExcel = new PHPExcel();
    
    foreach ($data as $key => $value) {
        $rows = $key + 1;
        foreach ($value as $k => $val) {
            $str = '';
            if (floor($k / 26) > 0) {
                $str .= IntToChr(floor($k / 26)-1);
            }
            $cols = $str . chr($k % 26 + 65);
            //允许针对单元格做扩展处理
            if (is_array($val)) {
                
                if (isset($val['cellFillColor'])) {
                //填充表格颜色
                    $objPHPExcel->getActiveSheet()->getStyle($cols . $rows)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
                    $objPHPExcel->getActiveSheet()->getStyle($cols . $rows)->getFill()->getStartColor()->setARGB($val['cellFillColor']);

                     //$objPHPExcel->getActiveSheet()->getStyle($cols . $rows)->getFont()->getColor()->setARGB($val['cellFillColor']);//设置单元格字体 PHPExcel_Style_Color::COLOR_RED 
                }
                if (isset($val['cellValue'])) {
                    $val = $val['cellValue'];
                }
            }
            
            $objPHPExcel->getActiveSheet()->setCellValue($cols.$rows, $val);
            
        }
    }

    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    //$objWriter->save('php://output');     
    $objWriter->save($fileurl);
    return array(
        'fileurl'=>$fileurl,
        'filename'=>$filename
    );
}
}

第四步:调用
假设我在testController.php 文件下有一个导出操作,

public function actionListexport(){
    $headerData = array("ID","Tutor","Level","Unit","Lession","Class Time");
    $bodyData = array();
    $bodyData[0]=$headerData;
    $data=array(
    	'0'=>array('6955','jack','PK预备级','Lession4','2017-05-28 08:00--08:50'),
    	'1'=>array('6956','lucy','PK预备级','Lession5','2017-05-27 08:00--08:50'),
    	'2'=>array('6957','tom','PK预备级','Lession6','2017-05-29 08:00--08:50'),
    	);

    if(!empty($data)){
        foreach ($data as $key => $value) {
            $bodyData[]=$value;
        }
    }
    //print_r($bodyData);exit();

    Yii::import("application.extensions.PutoutExcel",1);
    $objPHPExcel = new PutoutExcel();
    $res=$objPHPExcel->exportExcel($bodyData,$filename=' 课表导出.xls');
   
	$filename=$res['filename'];
	$fileurl=$res['fileurl'];
	
	ob_end_clean();
	header("Content-Type: application/force-download");
	header("Content-Transfer-Encoding: binary");
	header('Content-Type: application/zip');
	header('Content-Disposition: attachment; filename='.$filename);
	header('Content-Length: '.filesize($fileurl));
	error_reporting(0);
	readfile($fileurl);
	flush();
	ob_flush();
	exit;
	
}


这样一个导出功能就完成了
  • 评论于 2017-08-02 09:43 举报

    请教一下,foreach()能否补全 extensions目录是在common目录下新建的?

您需要登录后才可以评论。登录 | 立即注册