ThinkPHP3.1.3使用phpExcel1.8.0實現數據從Excel表格導入mysql數據庫

首先,去PHPExcel官方網站下載PHPExcel,官方地址爲;http://phpexcel.codeplex.com/.我下的是1.8.0版本的.解壓後發現還是蠻大的,有十幾M,不知道其他版本是不是會小點.
這裏寫圖片描述

把解壓好的PHPExcel文件放在ThinkPHP的Vender文件夾下(專門放第三方類庫的),如下圖

這裏寫圖片描述

其次,創建Excel轉換數組類,並把它放在ThinkPHP\Extend\Library\ORG\Util目錄下

class ExcelToArrary {  
    public function __construct() {  
        Vendor("PHPExcel.Classes.PHPExcel");//引入phpexcel類(留意路徑,不瞭解路徑可以查看下手冊)  
        Vendor("PHPExcel.Classes.PHPExcel.IOFactory"); //引入phpexcel類(留意路徑)      
    }  
    public function read($filename,$encode,$file_type){  
        if(strtolower ( $file_type )=='xls')//判斷excel表類型爲2003還是2007  
        {  
            Vendor("PHPExcel.Classes.PHPExcel.Reader.Excel5"); //引入phpexcel類(留意路徑)  
            $objReader = PHPExcel_IOFactory::createReader('Excel5');  
        }elseif(strtolower ( $file_type )=='xlsx')  
        {  
            Vendor("PHPExcel.Classes.PHPExcel.Reader.Excel2007");//引入phpexcel類(留意路徑)   
            $objReader = PHPExcel_IOFactory::createReader('Excel2007');  
        }  
        $objReader->setReadDataOnly(true);  
        $objPHPExcel = $objReader->load($filename);  
        $objWorksheet = $objPHPExcel->getActiveSheet();  
        $highestRow = $objWorksheet->getHighestRow();  
        $highestColumn = $objWorksheet->getHighestColumn();  
        $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);  
        $excelData = array();  
        for ($row = 1; $row <= $highestRow; $row++) {  
            for ($col = 0; $col < $highestColumnIndex; $col++) {  
                $excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();  
                }  
        }  
        return $excelData; 
    } 
}  

如右圖這裏寫圖片描述
現在來說Excel,表格的結構樣式和mysql樣式要類似,表格樣式如下(本人對Excel使用只是一般,所以如果有Excel大神做的報表,不知後果如何).
這裏寫圖片描述
前端頁面相關代碼:

<div>  
   <form method="post" action="{:U('Index/upload')}" enctype="multipart/form-data">  
        <font>導入Excel數據:</font>  
        <label for="file_stu">上傳</label>  
        <input name="file_stu" type="file" id="file_stu" />  
        <h3>溫馨提示:</h3>  
        <p>請確認您的Excel表格類型是xls的,以免出現兼容問題.</p>  
        <inputtypeinputtype="submit"  class="sure" value="導入" />  
   </form>  
</div> 

最後,控制器部分使用了Thinkphp自帶的上傳類,使用unlink()函數是爲了刪除上傳的excel表格,以免文件夾存入過多文件,調試代碼時可先註釋掉.或者不寫也行,把刪除文件的工作交給你們的運維.代碼中foreach循環部分$v[]裏的0, 1,2可以改動以下看看與Excel表格裏的內容是什麼關係.可以把數組打印出來看一看,你就很清楚了

相關代碼:

public function upload(){
    import('ORG.Util.ExcelToArrary');//導入excelToArray類
    if (! empty ( $_FILES ['file_stu'] ['name'] )){

       import('ORG.Net.UploadFile');
       $upload = new UploadFile();// 實例化上傳類
       $upload->maxSize  = 3145728 ;// 設置附件上傳大小
       $upload->allowExts  = array('xls', 'xlsx');// 設置附件上傳類型
       $upload->savePath =  './Uploads/';// 設置附件上傳目錄
       if(!$upload->upload()) {// 上傳錯誤提示錯誤信息
            $this->error($upload->getErrorMsg());
            }else{// 上傳成功 獲取上傳文件信息
                $info =  $upload->getUploadFileInfo();
            }
   }else{
       $this->error('(⊙o⊙)~沒傳數據就導入?!你在逗我?!');
   }
        //dump($info);die;
   $ExcelToArrary=new ExcelToArrary();//實例化  
   $res=$ExcelToArrary->read($info[0]['savepath'].$info[0]['savename'],"UTF-8",$info[0]['extension']);//傳參,判斷office2007還是office2003
   $res = array_slice($res,1); //爲了去掉Excel裏的表頭,也就是$res數組裏的$res[0];
   //dump($res);
   foreach ( $res as $k => $v ){ //循環excel表
        $data[$k]['mobile'] = $v [0];//創建二維數組  
        $data[$k]['name'] = $v [1];  
        $data[$k]['duty'] = $v [2];
    }
     //dump($data);die;
    $result=M('appkey')->addAll($data);  
    if(!$result){  
        $this->error('導入數據庫失敗');  
        exit();  
    }else{
         $filename = './Uploads/'.$info[0]['savename'];//上傳文件絕對路徑,unlink()刪除文件函數
         if (unlink($filename)) {
             $this->success ( '導入成功' ); 
         }else{
             $this->error('緩存刪除失敗');
         }

     }  

 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章