关闭

PHPEXCEL在thinkphp中封装成类使用

标签: phpexcel导出导入thinkphp
4403人阅读 评论(0) 收藏 举报
分类:

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

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

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

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

导出类:ArrayToExcel.class.php

<?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

<?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

<?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表



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:176454次
    • 积分:2859
    • 等级:
    • 排名:第12497名
    • 原创:98篇
    • 转载:45篇
    • 译文:1篇
    • 评论:35条
    最新评论