当前位置: 首页 > 后端技术 > PHP

ThinkPHP使用PHPExcle导出Excel文件

时间:2023-03-29 20:10:37 PHP

本文主要介绍thinkPHP中如何使用PHPExcel导出Excel文件。thinkPHP版本是3.2。我的博客:Mine-MuYan,欢迎骚扰,原文地址:ThinkPHP使用PHPExcle导出Excel文件。准备工作下载并配置PHPExcel扩展插件到PHPExcel官网或github下载最新的PHPExcel,放在ThinkPHP/Library/Vendor目录下。Vendor目录是默认放置PHP扩展包的文件夹。在Vendor目录下新建一个PHPExcel文件夹,把下载好的文件放在这里,解压。将PHPExcel.php文件重命名为PHPExcel.class.php。至此,插件安装已经完成,目录结构如下图所示,接下来是功能部分。CreateExcel方法生成Excel文件方法/***数据导出为.xls格式*@paramstring$fileName导出文件名*@param$expCellName数组->数据库字段和字段注释*@param$expTableData模型->连接数据库*/publicfunctionexportExcel($fileName='table',$expCellName,$expTableData){$xlsTitle=iconv('utf-8','gb2312',$fileName);//文件名$xlsName=$fileName.date("_Y.m.d_H.i.s");//或者$xlsTitle文件名可以根据自己的情况设置$cellNum=count($expCellName);$dataNum=count($expTableData);导入(“供应商。PHPExcel.PHPExcel”);import("Vendor.PHPExcel.Writer.Excel5");import("Vendor.PHPExcel.IOFactory.php");$objPHPExcel=new\PHPExcel();$cellName=array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');$objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合并单元格$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1',$fileName.'导出时间:'.date('Y-m-dH:i:s'));对于($i=0;$i<$cellNum;$i++){$objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2',$expCellName[$i][1]);}//杂项字形,UTF-8for($i=0;$i<$dataNum;$i++){for($j=0;$j<$cellNum;$j++){$objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+3),$expTableData[$i][$expCellName[$j][0]]);}}header('pragma:public');header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"');header("Content-Disposition:attachment;filename=$xlsName.xls");//附件新窗口打印inline本窗口打印$objWriter=\PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');$objWriter->save('php://output');出口;}方法生成说明$xlsName=$fileName.date("_Y.m.d_H.i.s");//或者$xlsTitle文件名可以根据自己的情况设置,上面是设置文件名是文件名_Y.m.d_H.i.s,_Y.m.d_H.i.s是导出时间,因为Windows下,文件名不能包含:,所以即使写成_Y.m.d_H:i:s,导出的文件也是_Y.m。导入("Vendor.PHPExcel.PHPExcel");导入("Vendor.PHPExcel.Writer.Excel5");导入("Vendor.PHPExcel.IOFactory.php");这三行是PHPExcel的介绍,因为当时的文件目录结构是ThinkPHP/Library/Vendor/PHPExcel,所以import("Vendor.PHPExcel.PHPExcel");,注意目录结构,只要importedlocation与放置PHPExcel的目录相同即可;$objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1')onlines20and21;//合并单元格$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1',$fileName.'导出时间:'.date('Y-m-dH:i:s'));该功能是合并Excel文件第一行的一行单元格,作为表格的标题或说明。如下图所示:setCellValue('A1',$fileName.'导出时间:'.date('Y-m-dH:i:s'));该值可以根据自己的需要修改;theheaderonline34("Content-Disposition:attachment;filename=$xlsName.xls");//attachmentnewwindowprintinginline这个窗口打印可以设置输出文件格式,这里是.xls,可以修改为.xlsx.三个参数调用这个方法需要传入三个参数(在方法开头的注释中已经提到),这里有更详细的解释:$fileName导出文件的文件名$expCellName数据库字段和字段注释(数组)$expTableData连接数据库方法调用callmethod/**export**/publicfunctionmsgOut(){$excel=A('Excel');$xlsCell=array(array('id','ID'),array('staff_name','昵称'),array('staff_real','真实姓名'),array('手机','手机号码'),array('card_id','身份证号码'),array('裁判','推荐人'),array('游戏id','游戏ID'),array('金钱','余额'),array('consume_coin','消费货币'),array('create_time','注册时间'),array('status','status'),);$xlsName='职员表查询结果导出';$字段=空;foreach($xlsCellas$key=>$value){if($key==0){$field=$value[0];}else{$field.=",".$值[0];}}$xlsModel=M('员工');如果(IS_POST){$地图=$this->_queryTime();$staff_name=I('staff_name');if($staff_name){if(is_numeric($staff_name)){$map["id|staff_name"]=array(intval($staff_name),array('like','%'.$staff_name.'%'),'_multi'=>真);}else{$map['staff_name']=array('like','%'.(string)$staff_name.'%');$xlsData=$xlsModel->Field($field)->where($map)->order('idDESC')->select();}foreach($xlsDataas$k=>$v){$xlsData[$k]['create_time']=$v['create_time']==null?'-':date("Y-m-dH:i",$v['create_time']);$xlsData[$k]['status']=$v['status']==1?'正常':'禁用';}$excel->exportExcel($xlsName,$xlsCell,$xlsData);}调用描述第3行$excel=A('Excel');这个方法我写在Application/Admin/Controller/ExcelController.class.php,当前controller是MainController.class.php,在其他controller中调用方法,使用TP自带的A(),所以第51行使用了$excel->exportExcel($xlsName,$xlsCell,$xlsData);,如果你的exportExcel()方法和当前调用的方法在同一个控制器中,那么第三行可以省略,第51行可以改成$this->exportExcel($xlsName,$xlsCell,$xlsData);第4行$xlsCell是导出这个表的所有字段和字段注意,导出后,该字段不能作为表的列名。不知道数据库字段含义的用户看了这张表就不知道为什么了。第17-24行从$xlsCell数组中提取字段名称并将其用作查询的字符串。当然你也可以手写这个字段名的字符串。我在这里使用foreach。第27~38行是查询条件和查询结果。如果没有查询条件,想导出整张表,使用$xlsData=$xlsModel->Field($field)->order('idDESC')->select();就是这样。第47~50行处理$xlsData的结果。我写的两个意思是:1.当`create_time`字段为空时,值为`-`,当有值时,使用`date()`函数将时间戳处理成日期;2、当`status`字段的值为1时,显示为`normal`,当值为0时,为`disabled`。有点啰嗦,见谅。模板文件模板文件很简单,一次提交即可。导出

表单form中的三个input是搜索条件,没有的话直接写button即可。文章结束,欢迎转载。