下载:
1.引入命名空间:
use Org\Net\Http;
2.在入口文件中设置根目录:
//定义根目录的绝对地址define(‘ROOT‘,str_replace("\\","/",dirname(__FILE__)));//定义根目录外的地址define(‘UPLOAD_PATH‘,str_replace("\\","/",dirname(dirname(__FILE__))));
3.控制器中的操作:
public function downloadss() { $work=D(‘Work‘);//实例化自定义基础模型类 ???$id = I(‘get.id‘); ???$file=$work->getWorkMsg($id);//根据ID获取文件字段名与下载的文件名称 ???//要下载的文件的完整路径 ???$fileurl = ROOT .‘/‘.‘Public‘.‘/‘. $file[‘文件字段名‘]; ???//ROOT.$file; ???//把路径用点炸开,以便获取文件后缀名 ???$arr = explode(‘.‘, $file[‘文件字段名‘]); ???//取得路径的最后尾缀,json_encode()中的第二个参数是为了解决中文转码的问题 ???$name = json_encode($file[‘name‘] . ‘.‘ . $arr[count($arr) - 1], JSON_UNESCAPED_UNICODE); ???$down = new Http(); ?//实例化下载类 ???$down->download($fileurl, $name);//下载的路径和名称}
4.模型类中的方法:用户根据ID获取要下载的文件字段名和下载的文件名称(例如:图片字段:picurl ,图片的名称:picurl_name)
public function getWorkMsg($id){ ???$where[‘w.stu_id‘]=$id; ???$list=$this->alias(‘w‘) ???????->where($where) ???????->join(‘oa_student_info s on w.stu_id=s.id‘,‘left‘) ???????->field(‘w.offer,s.name‘) ???????->find(); ???return $list;}
导入
先将配置文件YiXian放到ThinkPHP/Library/Org中,将PHPExcel放到Vendor文件中
1.视图层
<form method="post" action="<{:U(‘Home/StudentInfo/eximport‘)}>" enctype="multipart/form-data"> <input ?type="file" name="excel"/> <input type="submit" ?value="导入学员" class="dao dao1"/></form>
2.控制器层
//导入excelpublic function eximport(){ ???//导入操作之前,首先要做上传操作 ???$upload = new Upload();//↑注意引入↑(use Think\Upload;) ???$upload->maxSize ??= ????3145728 ; ???$upload->exts ?????= ????array(‘xls‘, ‘csv‘, ‘xlsx‘); ???$upload->rootPath ?= ?????‘./Public‘; ???$upload->savePath ?= ?????‘/excel/‘; ???$info ??= ??$upload->upload(); ???if(!$info){ ???????$this->error($upload->getError()); ???}else{//上传成功拼接获得上传文件的地址 ???????$filename=ROOT.‘/Public‘.$info[‘excel‘][‘savepath‘].$info[‘excel‘][‘savename‘]; ???????/* ????????* 引入导入操作所需的底层类文件 ????????* 文件路径ThinkPHP/Library/Org/YiXian/ExcelReader.class.php ????????*/ ???????import("Org.YiXian.ExcelReader"); ???????//实例化导入类 ???????$ExcelReader=new \ExcelReader(); ???????//调用导入类中的reader_excel(文件路径)方法 ???????$arr=$ExcelReader->reader_excel($filename); ???????$gArr=M(‘UserInfo‘)->select();//查询出归属人的信息 ???????$cArr=M(‘ClassInfo‘)->select();//查询出班级的信息 ???????/* ????????* 终级目标:组装成要插入数据库的数组$data[]; ????????* $arr[$key][‘1‘] : Excel表格中第2列的数据 ????????* $arr[$key][‘2‘] : Excel表格中第3列的数据(以下逐个递增) ????????* ????????* $data[‘name‘] ??:自定义的数组并赋值(以下以此类推) ????????* ????????* add() ??????????:调用add()方法,向数据库表中添加数据 ????????*/ ???????foreach ($arr as $key => $value) { ???????????$data[‘name‘]=$arr[$key][‘1‘]; ???????????/* ????????????* 由于学生表里面的性别字段存取的是数字,所以要先判断一下“男或女”, ????????????* 然后向数据库添加对应数字(***此处我用的判断方法是三目运算,也可 ????????????* 以使用其他的判断方法***) ????????????* 以下学费是否交齐字段也是类似的处理方法 ????????????*/ ???????????$data[‘sex‘]=($arr[$key][‘2‘]==‘男‘)?1:2;//三目运算将要导入的性别转换为数字 ???????????/* ????????????* 所在班级,数据处理 ????????????* 由于学生表里面的班级字段存取的是班级的ID,所以要先查询班级表的数据, ????????????* 然后做数组处理(下面的“归属人”,与此操作类似) ????????????*/ ???????????foreach ($cArr as $kk=>$vv){ ???????????????if ($vv[‘class_code‘] == $arr[$key][‘3‘]) ???????????????????$data[‘class_id‘] = $vv[‘id‘]; ???????????} ???????????$data[‘has_pay‘]=($arr[$key][‘4‘]==‘已交齐‘)?1:2; ???????????/* ????????????* 由于Excel表中日期存储的是时间格式,存入数据库要转换为时间戳格式 ????????????* 所以此处调用的strtotime()方法 ????????????* 此后遇到日期格式,就用此方法转换 ????????????*/ ???????????$data[‘birth_date‘]=strtotime($arr[$key][‘5‘]); ???????????$data[‘age‘]=$arr[$key][‘6‘]; ???????????/* ????????????* 由于学生表里面的学历字段存取的是数字,所以要先进行判断,然后把 ????????????* 对应的数字存储到数据库中(***此处我用的判断方法是switch,也可以使用 ????????????* 其他的判断方法***) ????????????*/ ???????????switch ($arr[$key][‘7‘]){ ???????????????case ‘初中级以下‘:$data[‘edu‘]=1; ???????????????????break; ???????????????case ‘高中‘:$data[‘edu‘]=2; ???????????????????break; ???????????????case ‘中专‘:$data[‘edu‘]=3; ???????????????????break; ???????????????case ‘大专‘:$data[‘edu‘]=4; ???????????????????break; ???????????????case ‘本科‘:$data[‘edu‘]=5; ???????????????????break; ???????????????case ‘硕士‘:$data[‘edu‘]=6; ???????????????????break; ???????????????case ‘博士‘:$data[‘edu‘]=7; ???????????????????break; ???????????????case ‘博士后‘:$data[‘edu‘]=8; ???????????????????break; ???????????} ???????????$data[‘school‘]=$arr[$key][‘8‘]; ???????????$data[‘profession‘]=$arr[$key][‘9‘]; ???????????$data[‘phone‘]=$arr[$key][‘10‘]; ???????????//归属人 ???????????foreach ($gArr as $kk=>$vv){ ???????????????if ($vv[‘name‘] == $arr[$key][‘11‘]) ???????????????????$data[‘userg_id‘] = $vv[‘id‘]; ???????????} ???????????$data[‘create_time‘]=strtotime($arr[$key][‘12‘]); ???????????$dataArr[]=$data; ???????} ???????$this->studentinfo->addAll($dataArr); ???????//数据导入成功之后的跳转操作 ???????$this->success(‘导入成功‘,U(‘StudentInfo/index_yx‘),3); ???}}
导出:
首先把PHPExcel放到Vendor文件夹中
在Application/Common下建立一个functions.php文件。
functions.php
<?php/* * 这个函数放在公共函数function.php(应用目录/Common/Common)里面 * Excel表格导出调用的函数 */function exportExcel($xlsName,$expCellName,$expTableData){ ???$fileName = $xlsName.date(‘_YmdHis‘);//or $xlsTitle 文件名称可根据自己情况设定 ???$cellNum = count($expCellName);//得到表头的长度 ???$dataNum = count($expTableData);//得到内容的长度 ???vendor("PHPExcel.PHPExcel");//引入EXCEL类包 ???$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.‘学生表‘); //输入标题 ???$objPHPExcel->setActiveSheetIndex(0)->getStyle ( ‘A1‘ )->getAlignment ()->setHorizontal ( \PHPExcel_Style_Alignment::HORIZONTAL_CENTER ); ?// 设置单元格水平对齐格式 ???$objPHPExcel->setActiveSheetIndex(0)->getStyle ( ‘A1‘ )->getAlignment ()->setVertical ( \PHPExcel_Style_Alignment::VERTICAL_CENTER ); ???????// 设置单元格垂直对齐格式 ???//输出标题栏 ???for($i=0;$i<$cellNum;$i++){ ???????$objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].‘2‘, $expCellName[$i][1]); ???} ???//输出内容栏 ???for($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="‘.$fileName.‘.xls"‘); ???header("Content-Disposition:attachment;filename=$fileName.xls"); ???$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, ‘Excel5‘); ???$objWriter->save(‘php://output‘); ???exit;}
1.视图层
<form action="<{:U(‘Home/StudentInfo/export‘)}>" method="post" class="dao_form"> ???????????????????<input type="hidden" name="sn" value="<{$sname}>" /> ???????????????????<input type="hidden" name="st" value="<{$tel}>" /> ???????????????????<button type="submit" ?target="_blank" class="dao">导出</button> ???????????????</form>
2.控制器
//导出Excel ???public function export(){ ???????/* ????????* 导出操作:从数据库中读取的数据,导出到Excel表格 ????????* $map : 搜索条件 ????????*/ ???????$map[‘del‘] ???= 1; ???????$map[‘status‘] = 2; ???????if (I(‘post.sn‘,‘‘) != ‘‘) ???????????$map[‘name‘] ?= array(‘like‘,‘%‘.I(‘post.sn‘,‘‘).‘%‘); ???????if (I(‘post.st‘,‘‘) != ‘‘) ???????????$map[‘phone‘] = array(‘eq‘,I(‘post.st‘,‘‘)); ???????//设置编码为utf-8 ???????header(‘content-type:text/html;charset=utf-8‘); ???????//导出的Excel表格的名字 ???????$xlsName ?= "学生列表"; ???????//导出的Excel表格的表头 ???????$xlsCell ?= array( ???????????array(‘id‘,‘序号‘), ???????????array(‘name‘,‘姓名‘), ???????????array(‘sex‘,‘性别‘), ???????????array(‘class_id‘,‘所在班级‘), ???????????array(‘has_pay‘,‘学费状况‘), ???????????array(‘birth_date‘,‘出生日期‘), ???????????array(‘age‘,‘入学年龄‘), ???????????array(‘edu‘,‘学历‘), ???????????array(‘school‘,‘毕业院校‘), ???????????array(‘profession‘,‘专业‘), ???????????array(‘phone‘,‘联系电话‘), ???????????array(‘userg_id‘,‘归属人‘), ???????????array(‘create_time‘,‘创建时间‘), ???????); ???????//依据搜索条件,在数据库中搜索数据 ???????$xlsData ?= $this->studentinfo->where($map)->select(); ???????$gArr=M(‘UserInfo‘)->select();//查询归属人的信息 ???????$cArr=M(‘ClassInfo‘)->select();//查询班级的信息 ???????//向Excel表格中添加的数据 ???????foreach ($xlsData as $k => $v) ???????{ ???????????/* ????????????* 由于学生表里面的性别字段存取的是数字,所以要先判断一下“男或女”, ????????????* 然后向Excel表格中添加对应简体汉字(***此处我用的判断方法是三目运算,也可 ????????????* 以使用其他的判断方法***) ????????????* 以下学费是否交齐字段也是类似的处理方法 ????????????*/ ???????????$xlsData[$k][‘sex‘]=($v[‘sex‘] == 1)?‘男‘:‘女‘; ???????????$xlsData[$k][‘has_pay‘]=($v[‘has_pay‘] == 1)?‘已交齐‘:‘未交齐‘; ???????????/* ????????????* 由于学生表里面的学历字段存取的是数字,所以要先判断一下“学历”, ????????????* 然后向Excel表格中添加对应简体汉字(***此处我用的判断方法是switch,也可 ????????????* 以使用其他的判断方法***) ????????????*/ ???????????switch ($v[‘edu‘]){ ???????????????case 1:$xlsData[$k][‘edu‘]=‘初中级以下‘; ???????????????????break; ???????????????case 2:$xlsData[$k][‘edu‘]=‘高中‘; ???????????????????break; ???????????????case 3:$xlsData[$k][‘edu‘]=‘中专‘; ???????????????????break; ???????????????case 4:$xlsData[$k][‘edu‘]=‘大专‘; ???????????????????break; ???????????????case 5:$xlsData[$k][‘edu‘]=‘本科‘; ???????????????????break; ???????????????case 6:$xlsData[$k][‘edu‘]=‘硕士‘; ???????????????????break; ???????????????case 7:$xlsData[$k][‘edu‘]=‘博士‘; ???????????????????break; ???????????????case 8:$xlsData[$k][‘edu‘]=‘博士后‘; ???????????????????break; ???????????} ???????????/* ????????????* ,数据处理 ????????????* 由于学生表里面的归属人字段存取的是员工的ID,所以要先查询员工表的数据, ????????????* 然后做数组处理(下面的“所在班级”,与此操作类似) ????????????*/ ???????????foreach ($gArr as $kk=>$vv){ ???????????????if ($vv[‘id‘] == $v[‘userg_id‘]) ???????????????????$xlsData[$k][‘userg_id‘] = $vv[‘name‘]; ???????????} ???????????//所在班级 ???????????foreach ($cArr as $kk=>$vv){ ???????????????if ($vv[‘id‘] == $v[‘class_id‘]) ???????????????????$xlsData[$k][‘class_id‘] = $vv[‘class_code‘]; ???????????} ???????????/* ????????????* 由于数据库表中日期存储的是时间格式,存入Excel要转换为时间格式 ????????????* 所以此处调用的date()方法 ????????????* 此后遇到时间戳格式,就用此方法转换 ????????????*/ ???????????$xlsData[$k][‘birth_date‘]=date("Y-m-d",$v[‘birth_date‘]); ???????????$xlsData[$k][‘create_time‘]=date("Y-m-d",$v[‘create_time‘]); ???????} ???????/* ????????* 调用公共函数文件function.php中的exportExcel()函数 ????????* exportExcel()函数是做导出操作的 ????????* function.php文件所在位置:根/应用目录/Common/Common/ ????????* $xlsName : Excel表格的名字 ????????* $xlsCell : Excel表格的表头 ????????* $xlsData : Excel表格的内容 ????????*/ ???????exportExcel($xlsName,$xlsCell,$xlsData); ???}
ThinkPHP3.2 下载、导入、导出功能的设计与实现
原文地址:https://www.cnblogs.com/houbingxu2014025681/p/8329250.html