PHPEXCEL在thinkphp中封装成类使用

PHPEXCEL在thinkphp中封装成类使用

标签: phpexcel导出导入thinkphp
2015-11-19 11:18 435人阅读 评论(0) 收藏 举报
 分类:
 
php(16) 
版权声明:本文为博主原创文章,未经博主允许不得转载。

phpexcel是一个强大的导入导出数据到excel表的插件类功能。本人在实际的项目开发中,会经常用到,下面为了以后方便使用,现将它封装成类。以下是在tp3.2的框架上使用。

(1)去phpexcel的官网下载phpexcel。

(2)在tp的核心库的第三库类vendor文件夹中新建一个excel的文件夹(自己定义合适文件夹名称就可以了),把下载的phpexcel文件夹和PHPExcel.php放在excel文件下。

(3)tp配置文件连接数据库就不说了

导出类:ArrayToExcel.class.php

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
<?php  
    /**  
    *导出excel表  
    *  
    */  
    class ArraryToExcel{  
        /**  
        *@param data    mysql中查询的二维数组数据  
        *@param path    PHPExcel的目录路径  
        *@param colAttr  列属性  
        *@param rowAttr  行属性  
        *@param options    属性选项  
        *@param excelObj   PHPExcel的对象  
        *@param valiData   列的有效性数据  
        */  
        private $data;  
        private $path;  
        private $excelObj;  
        private $colAttr=array(  
                'A'=>array(//列的属性设置  
                        'colName'=>'',//第一行的列名  
                        'keyName'=>'',//每一列对应的赋值数组的key值  
                        'width'=>''   //A列的宽度  
                    ),  
                //可以以 A B C D E F ....递增  
               /* 'B'=>array(//列的属性设置  
                        'colName'=>'',//第一行的列名  
                        'keyName'=>'',//每一列对应的赋值数组的key值  
                        'width'=>''   //B列的宽度  
                    ),  
                'C'=>array(//列的属性设置  
                        'colName'=>'',//第一行的列名  
                        'keyName'=>'',//每一列对应的赋值数组的key值  
                        'width'=>''   //C列的宽度  
                    ),  
                'D'=>array(//列的属性设置  
                        'colName'=>'',//第一行的列名  
                        'keyName'=>'',//每一列对应的赋值数组的key值  
                        'width'=>''   //D列的宽  
                    )  
                */  
            );  
        private $rowAttr=array(  
                'firstRowHeight'=>'', //第一行的列名的高度  
                'height'=>''         //2-OO无从行的高度  
                );  
        private $options=array(  
                'excelname'=>'导出excel',  //导出的excel的文件的名称  
                'sheettitle'=>'sheet1',    //每个工作薄的标题  
                'creater'=>'',             //创建者,  
                'lastmodified'=>'',        //最近修改时间  
                'title'=>'office xls document',//当前活动的主题  
                'subject'=>'office xls document',  
                'description'=>'数据导出',  
                'keywords'=>'数据导出',  
                'category'=>''  
            );  
        private $validData=array();  
  
        /**  
        *创建实例自动执行函数  
        */  
        public function __construct($data,$colAttr,$rowAttr,$options,$validData){  
            /**  
            *导入文件的位置一定要准确,本人是把放在Vendor下,先在Vendor下建一个excel文件夹  
            *把下载的PHPExcel文件夹和PHPExcel.php放在excel下.  
            */  
            $this->path=trim($path).'.';  
            Vendor($this->path.'PHPExcel')  
            $this->excelObj=new \PHPExcel();  
            $this->data=$data;  
            $this->colAttr=array_merge($this->colAttr,$colAttr);  
            $this->rowAttr=array_merge($this->rowAttr,$rowAttr);  
            $this->options=array_merge($this->options,$options);  
            $this->validData=array_merge($this->validData,$validData);  
             
        }  
            /**  
            *  @param data 从数据库取出来的数组  
            *  @param excelname  下载保存的文件名称   
            *  @param sheettitle  脚本的表名称  
            *  @param creater   创作者  
            *  
            */  
            //设置要注意顺序,先把各种的格式设置好,最后才存入值  
            //设置属性  
        public function push(){  
            $objPHPExcel=$this->excelObj;  
            $objPHPExcel->getProperties()  
                        ->setCreator($this->options['creater'])  
                        ->setLastModifiedBy($this->options['lastmodified'])  
                        ->setTitle($title)  
                        ->setSubject($this->options['subject'])  
                        ->setDescription($this->options['description'])  
                        ->setKeywords($this->options['keywords'])  
                        ->setCategory($this->options['category']);  
  
            //设置sheet的name  
            $objPHPExcel->getActiveSheet()->setTitle($this->options['sheettitle']);  
  
              
            //设置为excel的第一个表                   
             // $objPHPExcel->setActiveSheetIndex(0);  
            //循环设置样色            
                foreach($this->colAttr as $key=>$val){  
                    //设置每一列的字体居中显示,必须要同时设置水平居中和垂直居中  
                    $objPHPExcel->getActiveSheet()  
                             ->getStyle($key)  
                             ->getAlignment()  
                             ->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);   
                    $objPHPExcel->getActiveSheet()  
                             ->getStyle($key)  
                             ->getAlignment()  
                             ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);  
  
                    //设置第一行列名字段  
                    $objPHPExcel->getActiveSheet()->setCellValue($key.'1',$val['colName']);  
  
                    //设置列宽  
                    if(isset($val['width'])&&!empty($val['width'])){  
                        $objPHPExcel->getActiveSheet()->getColumnDimension($key)->setWidth($val['width']);    
                    }else{  
                        //自动根据字体的长度确定  
                        $objPHPExcel->getActiveSheet()->getColumnDimension($key)->setAutoSize(true);  
                    }  
                      
                }  
                //设置第一行高度  
                if(isset($this->rowAttr['firstRowHeight'])&&!empty($this->rowAttr['firstRowHeight'])){  
                            $objPHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight($this->rowAttr['firstRowHeight']);         
                }  
   
                //循环数组赋值excel单元格  
                foreach($this->data as $p=>$v){  
                    //行数num,第二行开始  
                    $row=$p+2;  
  
                    // 设置数据的有效性  
                    if(isset($this->validData)&&!empty($this->validData)) {  
                        // 总分数据有效性下拉菜单  
                        $objValidation1=$objPHPExcel->getActiveSheet()->getCell($this->validData['list1'][0].$row)->getDataValidation();  
                        $objValidation1->setType(\PHPExcel_Cell_DataValidation::TYPE_LIST);  
                        $objValidation1->setErrorStyle(\PHPExcel_Cell_DataValidation::STYLE_INFORMATION);  
                        $objValidation1->setAllowBlank(false);  
                        $objValidation1->setShowInputMessage(true);  
                        $objValidation1->setShowErrorMessage(true);  
                        $objValidation1->setShowDropDown(true);  
                        // $objValidation1->setErrorTitle('Input error');  
                        // $objValidation1->setError('Value is not in list.');  
                        // $objValidation1->setPromptTitle('Pick from list');  
                        // $objValidation1->setPrompt('Please pick a value from the drop-down list.');  
                        $objValidation1->setFormula1('"' . $this->validData['list1'][1] . '"');  
                        $objPHPExcel->getActiveSheet()->getCell('F'.$row)->setDataValidation($objValidation1);   
  
                        // 学期数据有效性下拉菜单  
                        $objValidation2=$objPHPExcel->getActiveSheet()->getCell($this->validData['list2'][0].$row)->getDataValidation();  
                        $objValidation2->setType(\PHPExcel_Cell_DataValidation::TYPE_LIST);  
                        $objValidation2->setErrorStyle(\PHPExcel_Cell_DataValidation::STYLE_INFORMATION);  
                        $objValidation2->setAllowBlank(false);  
                        $objValidation2->setShowInputMessage(true);  
                        $objValidation2->setShowErrorMessage(true);  
                        $objValidation2->setShowDropDown(true);  
                        // $objValidation2->setErrorTitle('Input error');  
                        // $objValidation2->setError('Value is not in list.');  
                        // $objValidation2->setPromptTitle('Pick from list');  
                        // $objValidation2->setPrompt('Please pick a value from the drop-down list.');  
                        $objValidation2->setFormula1('"' . $this->validData['list2'][1] . '"');  
                        $objPHPExcel->getActiveSheet()->getCell('G'.$row)->setDataValidation($objValidation2);  
  
                    }  
  
                    foreach($this->colAttr as $k=>$vo){  
                        /**  
                        *Excel的第A列,uid是你查出数组的键值,下面以此类推  
                        *将数组的值赋值excel的单元格  
                        */  
                        $objPHPExcel->getActiveSheet()->setCellValue($k.$row, $v[$vo["keyName"]]);  
                    }   
  
                    /**  
                    *设置行高  
                    */      
                    if(isset($this->rowAttr['height'])&&!empty($this->rowAttr['height'])){  
                        $objPHPExcel->getActiveSheet()->getRowDimension($row)->setRowHeight($this->rowAttr['height']);         
                    }                     
                }  
                       
            ob_end_clean(); //清除缓冲区,避免乱码  
            ob_start(); // Added by me  
            header('Content-Type: application/vnd.ms-excel');  
            header('Content-Disposition: attachment;filename="'.$this->options['excelname'].'.xls"');  
            header('Cache-Control: max-age=0');  
            $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');  
            $objWriter->save('php://output');  
            exit;  
       }  
 }  
?>  


 

 

导入类:ExcelToArrary.class.php

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
<?php  
class ExcelToArrary {  
    /**  
    *@param path string    //vendor下的存放phpexcel文件的路径  
    *@param filename   string  //上传后的excel文件的文件名  
    *@param ext        string  //文件格式后缀名  
    *@param $excelData array    //读取excel表数据存放在数组  
    */  
    private $path;  
    private $filename;  
    private $ext;  
    private $excelData=array();  
  
    /**  
    *实例化执行构造函数  
    */  
    public function __construct($path,$filename){  
        /*导入phpExcel核心类  注意 :你的路径跟我不一样就不能直接复制  
        *导入文件的位置一定要准确,本人是把放在Vendor下,先在Vendor下建一个excel文件夹  
        把下载的PHPExcel文件夹和PHPExcel.php放在excel下  
        */  
        $this->path=trim($path,'/');  
        $this->filename=$filename;  
        $this->ext=$this->getExt();  
  
        //引入phpexcel类(注意你自己的路径)  
        Vendor($this->path.".PHPExcel");    
        Vendor($this->path.".PHPExcel.IOFactory");   
        Vendor($this->path.".PHPExcel.Reader.Excel5");   
        Vendor($this->path.".PHPExcel.Reader.Excel2007");   
    }  
  
    /**  
    *获取文件后缀名称  
    */  
    private function getExt(){  
        return end(explode('.', $this->filename));  
    }  
    /*  
    @$filename  文件上传的路径名称,包括到文件格式  
    @$file_type  类型  
    */  
    public function read(){  
        if(strtolower($this->ext)=='xls')//判断excel表类型为2003还是2007  
            {  
                $objReader = \PHPExcel_IOFactory::createReader('Excel5');  
            }elseif(strtolower($this->ext)=='xlsx')  
            {  
                $objReader = \PHPExcel_IOFactory::createReader('Excel2007');  
            }  
        $objReader->setReadDataOnly(true);  
        $objPHPExcel = $objReader->load($this->filename);  
        $objWorksheet = $objPHPExcel->getActiveSheet();  
        $highestRow = $objWorksheet->getHighestRow();  
        $highestColumn = $objWorksheet->getHighestColumn();  
        $highestColumnIndex = \PHPExcel_Cell::columnIndexFromString($highestColumn);  
          
      //由于excel的第一行是字段,所以我们真正的数据实际第二行开始导入数组的。  
        for($row = 2; $row <= $highestRow; $row++) {  
            for ($col = 0; $col < $highestColumnIndex; $col++) {  
                $this->excelData[$row-2][] = (string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();  
            }  
        }  
        //清空缓存  
        $objPHPExcel->disconnectWorksheets();  
        //删除变量  
        unset($objReader, $objPHPExcel, $objWorksheet, $highestColumnIndex);  
        return $this->excelData;  
    }  
}  
?>  

将ExcelToArrary.class.php 类放在vendor的新建文件夹excel下(你自己所见的文件夹下)。
 

 

在控制器中的操作方法:export

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
<?php  
 namespace Home\Controller;  
 use Think\Controller;  
 class PhpexcelController extends Controller{  
  
    public function index(){  
             $this->display();  
    }  
    //导入excel表  
    public function import_execl(){  
        $upload = new \Think\Upload();       // 实例化上传类  
        $upload->maxSize   =     3145728 ;    // 设置附件上传大小  
        $upload->exts      =     array('xls');// 设置附件上传类型  
        $upload->rootPath  =     $_SERVER["DOCUMENT_ROOT"].'/lianxi/tp/Public/'; // 设置附件上传目录  
        $info   =  $upload->upload();  
        if(!$info){  
        // 上传错误提示错误信息         
            $this->error($upload->getError());      
          
        }else{  
            // 上传成功  
            $filename=$upload->rootPath.$info['file_stu']['savepath'].$info['file_stu']['savename'];  
            $path='excel';  
            Vendor('excel.ExcelToArrary');  
            $ExcelToArrary=new \ExcelToArrary($path,$filename);  
            //读取返回来的数组  
            $res=$ExcelToArrary->read();  
             var_dump($res);  
             //循环  
            foreach ( $res as $k => $v ){  
                 //addAll方法要求数组必须有0索引  
                 $data[$k]['id'] = $v[0];//创建二维数组  
                 $data[$k]['classname'] = $v[1];  
                 $data[$k]['classaddr'] = $v[2];     
                 $data[$k]['starttime'] = $v[3];  
            }  
            $userobj=M('user');//M方法  
            $myid=$userobj->where('id>=1')->delete();  
            $result=$userobj->addAll($data);  
            if(!$result){  
                $this->error('导入数据库失败');  
                exit();  
            }else{  
                $this->success ( '导入成功' );    
            }  
          
        }  
    }  
  
    //将数据导出excel表  
    public function exportToexcel(){  
           /**  
           *mysql的字段名称id,classname,classaddr,starttime  
           *  
           */  
            $m=M('user');  
            //查询的数据  
            $data=$m->where('id>=1')->select();  
            /**  
            *vendor下的新建的文件夹excel,excel包含下载的PHPExcel文件夹和PHPExcel.php  
            *  
            */  
            $path='excel';  
            //高属性参数  
            $colAttr=array(  
                //根据自己到处数据的实际情况添加列名  
                'A'=>array(//列的属性设置  
                        'colName'=>'编号id',//第一行的列名  
                        'keyName'=>'id',//每一列对应的赋值数组的key值  
                        'width'=>'20',   //每一列的宽度  
                    ),  
                'B'=>array(//列的属性设置  
                        'colName'=>'课程名称',//第一行的列名  
                        'keyName'=>'classname',//每一列对应的赋值数组的key值  
                        'width'=>'30'   //每一列的宽度  
                    ),  
                'C'=>array(//列的属性设置  
                        'colName'=>'教室地点',//第一行的列名  
                        'keyName'=>'classaddr',//每一列对应的赋值数组的key值  
                        'width'=>'20'   //每一列的宽度  
                    ),  
                'D'=>array(//列的属性设置  
                        'colName'=>'日期',//第一行的列名  
                        'keyName'=>'starttime',//每一列对应的赋值数组的key值  
                        'width'=>'20'   //每一列的宽度  
                    )  
            );  
            //行属性参数  
            $rowAttr=array(  
                'firstRowHeight'=>'20', //第一行的列名的高度  
                'height'=>'40'         //2-OO无从行的高度  
                );  
            //excel表的属性参数  
            $options=array(  
                'excelname'=>'用户数据',  //导出的excel的文件的名称  
                'sheettitle'=>'高一1班',    //每个工作薄的标题  
            );  
  
            Vendor('excel.ArraryToExcel');  
            $ArraryToExcel=new \ArraryToExcel($data,$path,$colAttr,$rowAttr,$options);  
            $ArraryToExcel->push();  
    }        
}  
  
?>  
这样子就可以将数据导出和导入至excel表

 

posted @ 2016-03-22 18:06  archoncap  阅读(848)  评论(0编辑  收藏  举报