首页 > Web开发 > 详细

PHPEXCEL在thinkphp中封装成类使用

时间:2016-03-22 19:24:28      阅读:483      评论:0      收藏:0      [点我收藏+]
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表

 

PHPEXCEL在thinkphp中封装成类使用

原文:http://www.cnblogs.com/archoncap/p/5307891.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!