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(' ');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章