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);
    }

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM