PHPExcel實現上傳excel文件導入數據庫

          項目中須要批量導入數據,感受這個需求之後也會常常用,必須總結分享下:
引入jquery的第三方表單插件:
  1. <scripttype="text/javascript"src="/js/lib/jquery.ajax.form.js"></script>
視圖文件:goods_list.ctp(商品列表 ),
  1. <div class="btnimport">
        <form class='myupload' action="<?=$this->Html->url(array('controller'=>'Goods','action'=>'batchImport'))?>" method='post' enctype='multipart/form-data' id="form_<?php echo $good['Good']['id']?>">
            <input class="fileupload" type="file" name="importExcel" data-id="<?php echo $good['Good']['id']?>">
        </form>
        <span>批量導入</span>
    </div>
    <style type="text/css">
        .btnimport{position: relative;overflow: hidden;margin-right:             4px;display:inline-block; *display:inline;padding:4px 10px 4px;font-size:14px;line-height:18px; *line-height:20px;color:#fff; text-align:center;vertical-align:middle;cursor:pointer;background:#5bb75b; border:1px solid #cccccc;background-color: #1fb5ad;; border-bottom-color:#b3b3b3;-webkit-border-radius:4px; border-color: #1fb5ad; -moz-border-radius:4px;border-radius:4px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } 
        .btnimport input{position: absolute;top: 0; right: 0;margin: 0;border:solid transparent; opacity: 0;filter:alpha(opacity=0); cursor: pointer;}
    </style>
使用input樣子 太醜了,還有個長條框,因而添加CSS修改樣子作的和其餘按鈕樣子同樣。每一個上傳對應一個form表單,多個商品對應各自的上傳事件,因而在form中添加id="form_<?php echo $good['Good']['id']?>",這樣每一個商品的導入就能夠調用各自的 ajaxSubmit事件。
傳入的jquery, 使用ajaxsubmit來提交表單。 Jquery表單插件ajaxForm用法詳解
  1. <script type="text/javascript">
        $(function () { 
            $(".fileupload").change(function(){
                var btnimport = $(".btnimport span");
                var id = $(this).data('id');
                $("#form_" + id).ajaxSubmit({
                    dataType:  'json',
                    data:{id:id},
                    success: function(data) {
                        switch(data['code']){
                            case 0:{
                                alert("批量導入成功");
                                //btnimport.html("批量導入");    //按鈕還原
                                window.location.reload();
                                break;
                            }
                            case -6000:{
                                btnimport.html("上傳失敗");
                                alert("上傳失敗!");
                                break;
                            }
                            case -6001:{
                                btnimport.html("上傳失敗");
                                alert("文件格式不正確!");
                                break;
                            }
                            default:{
                                alert("系統繁忙,請稍後再試!");
                                break;
                            }
                        }
                    },
                    error:function(xhr){
                        btnimport.html("上傳失敗");
                    }
                });
            });
        }); 
    </script>
action中的處理方法:
  1. /**
     * [batchImport 批量導入]
     * @return [type] [description]
     */
    public function batchImport(){
        $id = $this->request->data('id');
        $DOMAIN = $_SERVER['HTTP_HOST'];
        $file = $_FILES;
        $filename = $file['importExcel']['name'];
        $file_temp_name =$file['importExcel']['tmp_name'];
        $dir = WWW_ROOT.'/files' . DS . 'xls';
        $type = strstr($filename,'.');
        if($type != '.xls' && $type != '.xlsx'){
            $this->_err_ret(-6001,'sys err');
        }
        if(is_uploaded_file($file_temp_name)){
    
            $full_name = $dir.DS. date ( 'Y-m-d_h:i:s' ).'_'.$filename;
            $result = move_uploaded_file($file_temp_name, $full_name);
            //處理文件路徑,便於訪問
            //$full_name = explode('webroot/', $full_name);
            //$full_name = 'http://' . $DOMAIN .'/aaa/bbb'.$full_name[1];
        }else{
            $this->_err_ret(-6000,'err'); 
        }
        //若是上傳文件成功,就執行導入 excel操做
        $objReader = PHPExcel_IOFactory::createReaderForFile($full_name);
        $objPHPExcel = $objReader->load($full_name);
        $objPHPExcel->setActiveSheetIndex(0);
        $sheet = $objPHPExcel->getSheet(0);
        $highestRow = $sheet->getHighestRow(); // 取得總行數
        $test = $objPHPExcel->getActiveSheet()->getCell('A2')->getValue();
        $data = array();
        for ($i=2; $i <= $highestRow ; $i++) {
            $sn =  $objPHPExcel->getActiveSheet()->getCell('A'.$i)->getValue();
            $pwd = $objPHPExcel->getActiveSheet()->getCell('B'.$i)->getValue();
            $this->Card->create();
            $data = array(
                'sn' => $sn,
                'pwd' => $pwd,
                'good_id' => $id,
            );
            if(!$this->Card->save($data)){
                $this->_err_ret(-6000,'err');
                exit;
            }
        }
        $newNumber = (int)$this->Good->findById($id)['Good']['number']+(int)$highestRow-1;
        $this->Good->id = $id;
        if(!$this->Good->saveField('number',$newNumber)){
            $this->_err_ret(-6000,'err');
        }
        $this->_suc_ret($id);        
    }
相關文章
相關標籤/搜索