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表