当前位置: 首页 > news >正文

ThinkPHP3.2 下载、导入Excel表格内容、导出内容到Excel表格功能的设计与实现

下载:

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.控制器层

//导入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);
    }
}

 导出:

首先把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);
    }

 

 



转载于:https://www.cnblogs.com/houbingxu2014025681/p/8329250.html

相关文章:

  • CORS跨域cookie传递
  • Python3 的元组
  • 【转】四款经典3.7v锂电池充电电路图详解
  • [TJOI2013]循环格
  • 6. python 字符串格式化表达式
  • tomcat 取消项目名访问路径
  • 【Python】学习笔记5-模块pymysql操作mysql数据库
  • mysql innodb myisam 比较
  • Git 安装配置
  • typeof面试题解答
  • 辩证看待 iostat
  • RpcContext
  • mysql学习笔记(1)--varChar和char类型的区别
  • etcd raft library
  • jQuery数组去重复
  • 时间复杂度分析经典问题——最大子序列和
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • classpath对获取配置文件的影响
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • export和import的用法总结
  • gitlab-ci配置详解(一)
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • vue-cli在webpack的配置文件探究
  • 当SetTimeout遇到了字符串
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 如何学习JavaEE,项目又该如何做?
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 小程序开发中的那些坑
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ‌[AI问答] Auto-sklearn‌ 与 scikit-learn 区别
  • # Panda3d 碰撞检测系统介绍
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #QT(TCP网络编程-服务端)
  • (C++17) std算法之执行策略 execution
  • (done) 声音信号处理基础知识(4) (Understanding Audio Signals for ML)
  • (rabbitmq的高级特性)消息可靠性
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (力扣)循环队列的实现与详解(C语言)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)【Hibernate总结系列】使用举例
  • (转)程序员疫苗:代码注入
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET MVC第三章、三种传值方式
  • .net Stream篇(六)
  • .NET 设计模式初探
  • .net 设置默认首页