PHP Excel導入

PHP Excel導入

僅個人開發記錄,方便以後查看。輕噴。也請多多指正。
包含:

  1. ajax導入(最後)。
  2. 文件上傳。
  3. 導入excel獲取。
  4. 導出錯誤excel。

後臺導入方法

public function import(){
        if (!IS_POST) {
            $this->error("訪問錯誤,請確認後重試!");
        }

        $upload = new Upload(); // 實例化上傳類
        $upload->maxSize = 3145728; // 設置附件上傳大小
        $upload->exts = array('xls', 'xlsx', 'txt'); // 設置附件上傳類
        $upload->autoSub = false;
        $upload->rootPath = './Uploads/';
        $upload->savePath = '/***/'; // 設置附件上傳目錄
        $upload->saveName = date('YmdHis',time());
        $info = $upload->uploadOne($_FILES['excel']);
        if (!$info) {
            $this->error($upload->getError());
        }

        $filename = './Uploads' . $info['savepath'] . $info['savename'];
        $ext = $info['ext'];

        *//public 方法獲取excel中的數據*
        $excels = $this->importGet($filename, $ext);

        if (empty($excels)) {
            $this->error('數據爲空,請確認後重試!');
        }else{
            $proj_id=rsa_decode($excels[1]['C'],getChoosekey()) ;
            $pc_id=rsa_decode($excels[1]['H'],getChoosekey());
            unset($excels[1]);
            unset($excels[2]);
            $excels=array_merge($excels);


            $back_excel = [];
            $back_excel['in_all'] = count($excels);

            *//存放錯誤數據下標* 
            $key_arr = [];
            *//存放正確下標*
            $right_arr=[];

            *//開始驗證excel數據
            //驗證完成後 錯誤數據下標存入$key_arr 正確數據存入$right_arr*

            $key_arr = array_unique($key_arr);
            $key_arr = array_merge($key_arr);

            $right_arr= array_unique($right_arr);
            $right_arr = array_merge($right_arr);

            $repeat_arr = [];
            for ($i = 0; $i < count($key_arr); $i++) {
                if (isset($excels[$key_arr[$i]])) {
                    $repeat_arr[] = $excels[$key_arr[$i]];
                    unset($excels[$key_arr[$i]]);
                }
            }
            $excels = array_merge($excels);

            *//如果錯誤數據不爲空 則輸出*
            if ($repeat_arr) {
                $back_excel['in_error'] = count($repeat_arr);
                import("Org.Util.PHPExcel");
                import("Org.Util.PHPExcel.Writer.Excel5");
                import("Org.Util.PHPExcel.IOFactory.php");

                *//創建PHPExcel對象,注意,不能少了*
                $PHPExcel = new \PHPExcel();

                *//激活表格*
                $filename = "error-" . date('YmdHis',time()) . ".xls";
                $PHPExcel->getActiveSheet()->getStyle('A')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);
                ...
                $PHPExcel->getActiveSheet()->getStyle('L')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);



                *//設置excel格式*
                $PHPExcel->getActiveSheet()->getStyle("A")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                   ...
                $PHPExcel->getActiveSheet()->getStyle("L")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

                *//設置每列名稱*
                $PHPExcel->getActiveSheet()->setCellValue('B1', '');
                ..
                $PHPExcel->getActiveSheet()->setCellValue('J1', "");


                $PHPExcel->getActiveSheet()->getStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                $PHPExcel->getActiveSheet()->getStyle('A1:J1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID); // 背景填充方式
                $PHPExcel->getActiveSheet()->getStyle('A1:J1')->getFill()->getStartColor()->setARGB('00dc93d5'); // 背景色
//        $PHPExcel->getActiveSheet()->getStyle('A1:E1')->getFont()->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_WHITE);
                *//設置寬度*
                $PHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(50);
                ...
                $PHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(20);

                *//將值傳入*
                for ($i = 0; $i < count($repeat_arr); $i++) {
                    $PHPExcel->getActiveSheet()->setCellValueExplicit("A" . ($i + 2), $repeat_arr[$i]['A'], \PHPExcel_Cell_DataType::TYPE_STRING);
                    ..
                    $PHPExcel->getActiveSheet()->setCellValue("L" . ($i + 2), $repeat_arr[$i]['L']);
                }

                *//將錯誤數據下載地址存入*
                $filePath = './Uploads/weixresever/resever_error/' . $filename;
                $objWriter->save($filePath);
                $back_excel['error_path'] = $filePath;

            }

            *//用戶填寫了的數據*
            $back_excel['in_yx']=(count($repeat_arr) + count($right_arr)) ;
            *//正確導入數目*
            $back_excel['right']=count($right_arr);
            *//錯誤數據數目*
            $back_excel['error']=count($repeat_arr);


            echo json_encode($back_excel);
            exit;



        }



    }
... prompt'''

獲取excel數據的方法


 public function importGet($filename, $exts = 'xls'){
        import("Org.Util.PHPExcel");
        //創建PHPExcel對象,注意,不能少了\
        $PHPExcel=new \PHPExcel();
        //如果excel文件後綴名爲.xls,導入這個類
        if($exts == 'xls'){
            import("Org.Util.PHPExcel.Reader.Excel5");
            $PHPReader=new \PHPExcel_Reader_Excel5();
        }else {
            import("Org.Util.PHPExcel.Reader.Excel2007");
            $PHPReader=new \PHPExcel_Reader_Excel2007();
        }
        //載入文件
        $PHPExcel=$PHPReader->load($filename);
        //獲取表中的第一個工作表,如果要獲取第二個,把0改爲1,依次類推
        $currentSheet=$PHPExcel->getSheet(0);
        //獲取總列數   J
        $allColumn=$currentSheet->getHighestColumn();
        //獲取總行數  54
        $allRow=$currentSheet->getHighestRow();

        if (empty($allRow)||$allRow<3)
        {
            $this->error('文件內容爲空');
        }else{
            $data = array();
            for ($currentRow = 1; $currentRow <= $allRow; $currentRow++) {
                //從哪列開始,A表示第一列
                for ($currentColumn = 'A'; $currentColumn <= $allColumn; $currentColumn++) {
                    //數據座標
                    $address = $currentColumn . $currentRow;

                    //讀取到的數據,保存到數組$arr中
                    if ($currentColumn === 'A') {
                        $data[$currentRow][$currentColumn] = (string) $currentSheet->getCell($address)->getValue();
                    } else {
                        $data[$currentRow][$currentColumn] = (string) $currentSheet->getCell($address)->getValue();
                    }
                }
            }
            return $data;
        }
    }

... prompt'''

**

前臺ajax

**

$(document).on('click', "$selector", function() {

            var $form = $(this).parent().parent().parent();
            var $formData = new FormData($form[0]);
            // console.log($form.attr('action')); return false;
            var options = {
                url: $form.attr('action'),
                type: 'POST',
                dataType: 'JSON',
                async: false,
                cache: false,
                data: $formData,
                // 告訴jQuery不要去處理髮送的數據
                processData : false,
                // 告訴jQuery不要去設置Content-Type請求頭
                contentType : false,
                success: function (data) {
                    // console.log(data);return false;
                    if(data.hasOwnProperty("in_error")){
                        layer.closeAll();
                        layer_alert('存在異常數據!,一共填寫了'+data['in_yx']+'條,導入成功'+data['right']+"條,點擊確認後下載異常數據.",function () {
                            layer.closeAll();
                            window.open("http://"+window.location.host+data['error_path']);
                            window.location.reload();
                        });
                    }else if(data.hasOwnProperty("in_all")){
                        layer.closeAll();
                        layer_msg('全部導入成功');
                        window.location.reload();
                    }else{
                        layer_msg(data.info);
                    }
                },
                error: function () {
                    gritter_alert("導入失敗,請確認後重試!");
                }
            };

            $.ajax(options);

            return false;
        });

... prompt'''
public function comeon($name){
    echo "Relax yourself , everything will be better ".$name;
}
$this->comeon(' ');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章