使用PHPExcel实现对excel数据的导入和导出

         因公司业务需求,需要使用excel文件进行大量的数据的操作,如:批量用户注册、批量修改用户名、批量修改手机号等。由于之前没有做过这种对excel文件的操作,后从网上搜了一下,最后确定使用PHPExcel类。现将使用方法分享给大家。

         PHPExcel类是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格。


        1、前台excel文件操作界面

        首先,我们需要在前台HTML页面进行文件的上传,如:


代码如下:

<pre name="code" class="html"><form enctype="multipart/form-data" method="post" id="uploadshow" action="{:U('admin/UserManagement/upload')}
">
  <p id="mainp">
    用户注册绑定管理 → 用户批量注册绑定
  </p>
  <ul id="uls">
    <li οnclick="location='{:U('admin/UserManagement/onebatchre')}'">单个用户注册</li>
    <li class="cur" οnclick="location='{:U('admin/UserManagement/batchregistration')}'">批量用户注册</li>
  </ul>
  <p id="mainimg">
    请选择批量注册文件:
    <input class="inimg" id="urlImg" type="text" aria-describedby="basic-addon2" readonly value="" id="logo" name="logo">
    <input type="button" id="basic-addon2" class="input-group-addon pointer" value="选择文件" >
    <input type="file" data-name="" class="file pointer" id="upFile" name="upFile" accept=".xls"/>
    <a style="width:100px; height:20px; display:block; margin: -18px 0px 0px 525px;" href="/oms/Uploads/templates/plzc.xls">下载模板文件</a>      
  </p>
  <p id="mainl">
    <label id="loyu">支持Excel文档,每次操作请不要超过500条数据</label>
    <label id="jingyu">仅限xls格式,文件最大不超过2M</label>
    <label id="kong">请选择文件!</label>
  </p>
  <p>
    <input  type="hidden" value="1" class="" name="style" data-num="0"/>
    <input  type="submit" id="submitImg" value="确定上传" class="" data-num="0"/>
  </p>
</form>

        2、控制器Action层,负责文件的上传

        首先,需要先将所选择的文件上传到服务器,类似于上传图片的那种功能,代码如下:

public function upload(){
    header("Content-Type:text/html;charset=utf-8");
    import("ORG.Net.UploadFile"); 

        $style = $_POST['style'];
        $upload = new UploadFile();
    $upload->saveRule  = 'uniqid';
    $upload->maxSize   =  3145728 ;               // 设置附件上传大小
    $upload->allowExts =  array('xls', 'xlsx');   // 设置附件上传类
    $upload->savePath  =  WANBU_PATH."/oms/Uploads/zc/";  // 设置附件上传目录
    // 上传文件
    if(!$upload->upload()) {    // 上传错误提示错误信息
      $this->error($upload->getErrorMsg());
      }else{    // 上传成功
      $info =  $upload->getUploadFileInfo();    //二维数组
      $filename = $upload->savePath . $info['0']['savename'];
      $exts = $extension = $info['0']['extension'];
      //文件上传成功后,进入model层处理上传文件
      $data = D("HandleData")->goods_import($filename, $exts,$style);
          $msg = "数据上传成功<b>".$data['success']."</b>条,失败<b>".$data['fail']."</b>条";
          setSystemLog($_SESSION['userInfo']['username'],'','用户管理','用户批量注册绑定管理',$msg);
    }
    $success=$data['success'];
    $fail=$data['fail'];
    $filename=$data['filename'];
    $empty=0;
    $success=$success?$success:$empty;
    $fail=$fail?$fail:$empty;
    $this->assign('success',$success);
    $this->assign('fail',$fail);
    $this->assign('filename',$filename);
    $this->display("batchregistration");
}

          3、模型Model层,负责数据的处理

         首先,我们需要了解excel文件的内容,例如:批量用户注册

        然后,根据具体需求判断上传的文件数据是否符合要求。

//导入数据方法
    function goods_import($filename, $exts,$style){
        //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能import导入
        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 if($exts == 'xlsx'){
            import("ORG.Util.PHPExcel.Reader.Excel2007");
            $PHPReader=new PHPExcel_Reader_Excel2007();
        }
        //载入文件
        $PHPExcel=$PHPReader->load($filename);
        //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
        $currentSheet=$PHPExcel->getSheet(0);
        //获取总列数
        $allColumn=$currentSheet->getHighestColumn();
        //获取总行数
        $allRow=$currentSheet->getHighestRow();
        //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
        for($currentRow=2;$currentRow<=$allRow;$currentRow++){
            //从哪列开始,A表示第一列
            for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){
                //数据坐标
                $address=$currentColumn.$currentRow;
                //读取到的数据,保存到数组$arr中
                $data[$currentRow][$currentColumn]=$currentSheet->getCell($address)->getValue();
            }
        }
        $res=$this->save_import($data,$style); 
        return $res;
    }

    //保存导入数据
    function save_import($data,$style){      
        //如果上传空文件
        if(count($data)==0){
            $num['success']=0; 
            $num['fail']=0; 
            $num['filename']="none"; 
            return $num;
        }

        //批量注册
        $datalist=array();
        $inittime = date('Y-m-d H:i:s', time());
        foreach ($data as $k=>$v){  
            $datalist[$k]=$v;
            if($k >= 2){
                if($k < 502){
                    //用户名校验
                    $username=trim($v['A']);
                    if($username){   
                        $nameLen = (strlen($username) + mb_strlen($username,'UTF8')) / 2;
                        if($nameLen > 15){
                            $datalist[$k]['C']='用户名仅限3-15个字符';continue;
                        }else{  
                            $specialChar = D("UserInfo")->testspechars($username);    
                            if($specialChar == 0){              
                                $datalist[$k]['C']='用户名存在特殊字符';continue;
                            }else{
                                $result=D("DataUser")->checkUsername($username);
                                if(!$result){
                                    $info[$k-2]['username'] = $username;
                                }else{
                                    $datalist[$k]['C']='用户名已存在';continue;
                                }
                            }                   
                        }                   
                    }else{
                        $datalist[$k]['C']='请输入注册用户名';continue;
                    }

                    //手机号校验
                    $mobile=trim($v['B']);
                    if($mobile){
                        $length = strlen($mobile);
                        if($length!=11){
                            $datalist[$k]['C']='手机号码须为11位数字';continue;
                        }else{
                            $info[$k-2]['mobile'] = $mobile;
                        }                
                    }else{
                        $datalist[$k]['C']='请输入注册手机号码';continue;
                    }                     
                }else{
                    $datalist[$k]['C'] = "数据超过500条,请分多次操作";continue;
                }
            }

            //入库操作
            static $num_success=0;
            if(!$datalist[$k]['C']){
                $userid=D("DataUser")->addData($mobile,$username); 
                
                $data['userid'] = $userid;
                $data['mobile'] = $mobile;
                $uploadUserinfo = D("DataUser")->uploadData($data,2); 

                $num_success++;
            } 
            $num['success']=$num_success;
            $datalist[$k]=array();                         
        }

        if($datalist){
            $k=2;
            foreach($datalist as $key=>$val){
                if(empty($val)){
                    continue;
                }
                $data_list[$k++]= $val; 
            }
            $num['fail']=count($data_list); 
            $re=$this->goods_export($datalist,$style);
        }      
        $num['filename']=$re; 
        return $num;
    }

    //导出数据方法
    protected function goods_export($goods_list=array(),$style)
    {       
        $goods_list = $goods_list;
        $k=2;
        foreach($goods_list as $key=>$val){
            if(empty($val)){
                continue;
            }
            $datalist[$k++]= $val; 
        }
        $data = array();

        foreach ($datalist as $k=>$goods_info){    
            $data[$k][A] = $goods_info['A'];
            $data[$k][B] = $goods_info['B'];
            $data[$k][C] = $goods_info['C'];
        }
        $filename="plzc_fail";  
        
        $re=$this->getExcel($filename,$data,$style);
        return $re;
    }

    //导出数据
    private  function getExcel($fileName,$data,$style){   
        //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
        import("ORG.Util.PHPExcel");
        import("ORG.Util.PHPExcel.Writer.Excel5");
        import("ORG.Util.PHPExcel.IOFactory.php");

        $date = date("Y_m_d_H_i_s",time());
        $fileName .= "_{$date}.xls";

        //创建PHPExcel对象,注意,不能少了\
        $objPHPExcel = new \PHPExcel();
        $objProps = $objPHPExcel->getProperties();

        //设置表头
        $objPHPExcel->getActiveSheet()->setCellValue('A1', '用户名(必填)');
        $objPHPExcel->getActiveSheet()->setCellValue('B1', '手机号(必填)');
        $objPHPExcel->getActiveSheet()->setCellValue('C1', '失败原因');

        //设置宽度
        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(15);
        $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(22);
        $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);

        //设置自动换行
        $objPHPExcel->getActiveSheet()->getStyle('C1:AC'.($k+2))->getAlignment()->setWrapText(true);
 
        //设置行高
        $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(28);
        $objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(15);
        //设置字体
        $objPHPExcel->getActiveSheet()->getStyle()->getFont()->setName('宋体');
        //所有垂直居中
        $objPHPExcel->getActiveSheet()->getStyle('A1:AC'.($k+2))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

        $column = 2;
        $objActSheet = $objPHPExcel->getActiveSheet();

        foreach($data as $key => $rows){ //行写入
            $span = ord("A");      
            foreach($rows as $keyName=>$value){// 列写入
                $j = chr($span);
                $objActSheet->setCellValueExplicit($j.$column, $value,PHPExcel_Cell_DataType::TYPE_STRING);      
                $span++;          
            }
            $column++;
        }
        $fileName = iconv("utf-8", "gb2312", $fileName);   
        //设置活动单指数到第一个表,所以Excel打开这是第一个表
        $objPHPExcel->setActiveSheetIndex(0);   
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        //保存至某一位置  
        $objWriter->save(WANBU_PATH."/oms/Uploads/error/" . $fileName);   
        if($fileName){   
            return $fileName;
        } 
    }

         其中,如果有不符合需求的数据,会保存在失败文件中,并指出失败原因,如:


        到此,PHPExcel类就算学习完了,本人拙见,欢迎探讨。


 


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值