zoukankan      html  css  js  c++  java
  • 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 HomeController;  
     use ThinkController;  
     class PhpexcelController extends Controller{  
      
        public function index(){  
                 $this->display();  
        }  
        //导入excel表  
        public function import_execl(){  
            $upload = new ThinkUpload();       // 实例化上传类  
            $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表
  • 相关阅读:
    Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version) 构造
    Codeforces Round #598 (Div. 3) F Equalizing Two Strings(构造题)
    codeforces round # 384 div2 B Chloe and the sequence 神奇二进制找规律题
    codeforces round #384 div2 C Vladik and fractions(构造)
    线段树板子
    Codeforces Round #616 (Div. 2) D (找规律题)
    codeforces round #616 div2 A (Even but not even)水题
    2017的计划清单
    回顾2016,我的简单总结
    关于ubuntu下sublime text 3 的安装和中文配置问题
  • 原文地址:https://www.cnblogs.com/archoncap/p/5307891.html
Copyright © 2011-2022 走看看