ThinkPHP3.2 下载、导入、导出功能的设计与实现
下载:
1.引入命名空间:
use Org\Net\Http;
2.在入口文件中设置根目录:
//定义根目录的绝对地址 define('ROOT',str_replace("\\","/",dirname(__FILE__))); //定义根目录外的地址 define('UPLOAD_PATH',str_replace("\\","/",dirname(dirname(__FILE__))));
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; }
导入
先将配置文件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.控制器层
//导入excel public 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); } }
导出:
首先把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.控制器
//导出Excelpublic 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); }
转载于:https://www.cnblogs.com/xiantu/p/8337346.html
ThinkPHP3.2 下载、导入、导出功能的设计与实现相关推荐
- SpringBoot 项目实现 Excel 导入导出功能
背景 Excel 导入与导出是项目中经常用到的功能,在 Java 中常用 poi 实现 Excel 的导入与导出.由于 poi 占用内存较大,在高并发下很容易发生 OOM 或者频繁 fullgc,阿里 ...
- SpringBoot 项目优雅实现 Excel 导入导出功能
背景 Excel 导入与导出是项目中经常用到的功能,在 Java 中常用 poi 实现 Excel 的导入与导出.由于 poi 占用内存较大,在高并发下很容易发生 OOM 或者频繁 fullgc,阿里 ...
- MSE ZooKeeper 数据导入导出功能上线
作者:草谷 背景 MSE 提供了托管版的 ZooKeeper,拥有比自建开源 ZooKeeper 稳定性更高的SLA,同时管控面提供了丰富的服务自治功能.赶在2022年的岁末,MSE ZooKeepe ...
- VUE的Excel导入导出功能
在做人力资源管理的后台项目时,实现了excel表的导入导出功能.用到了vue-element-admin提供的框架(链接地址 ),我们只需要在自己的项目中封装改造即可. 项目中实现excel表的导入与 ...
- 文件上传下载导入导出
ps: 代码已提交到gitee: https://gitee.com/Lazy_001/file-demo 文件上传下载导入导出 一.首先完成准备工作 1. 创建一个Springboot项目 < ...
- 十分钟看会laravel导入导出功能,就这么简单
laravel5扩展包excel导入导出功能 一, 简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel,从而方便我们以优雅的.富有表现力的 ...
- 让模块支持“导入”“导出”功能
让模块支持"导入""导出"功能 DNN模块可以支持导入导出功能,通过将模块内容导入到XML文件可以便于模块内容备份和转移,也可将模块内容事先以XML格式保存通过 ...
- easyexcel多个sheet导入_Java中Easypoi实现excel多sheet表导入导出功能
Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写. 第一步引入Easypoi依赖 cn.afterturn easypoi-spring-boot-st ...
- 安全组规则跨region导入导出功能介绍
功能介绍 您可以在控制台clone一个安全组,进而快速创建安全组和添加安全组规则,但这个功能有个限制是无法跨region使用.为此ECS控制台开发了安全组规则导入导出功能,使用这个功能您可以把一个安全 ...
- SpringBoot中使用Easyexcel实现Excel导入导出功能(三)
导出的数据包含有图片 导出excel表格的数据包含有图片,这种场景比较少.通Easyexcel实现这样的需求,我认为最简便的方法就是使用前面提到的自定义转换器(com.alibaba.excel.co ...
最新文章
- 2020年,语义分割可以在哪些方向进行研究并取得突破?
- DS实验题 Floyd最短路径 Prim最小生成树
- MySQL Index Condition Pushdown 原理与解析
- 使用Innobackupex快速搭建(修复)MySQL主从架构
- QCustomplot怎么实现对大数据量的自适应采样显示不卡顿
- Java中实用类:Date、Calendar、Math、Random、String、StringBuffer的用法
- NPM包管理器跟换国内镜像CNPM
- 让数据库操作变成非阻塞的
- ibatis_HelloWorld
- VMware mac虚拟机如何安装Windows系统
- Python_pip_03_安装模块出现错误时咋整
- 40-42-网络层ARP协议,ARP欺骗,网络执法官和arp防火墙
- linux的交换空间是什么意思,Linux交换空间是什么
- The Little Schemer读书笔记1
- 递归、迭代、分治、回溯、动态规划、贪心算法
- 【信息系统集成】-成本管理错题
- BIRT 使用说明书
- 中国互联网量级分化严重:小米将360踢出第二阵营
- 企业购置新车,各项费用会计入账以及案例分析
- python代码格式怎么写比较好