phpExcel 上传excel文档

版本:thinkphp3.2.1

1.下载phpexcel 最新版,然后将文件的class文件的两个文件丢进Thinkphp/Library/PHPExcel(此文件自己创建);

public function uploadExcel() {
    set_time_limit(0);
    ini_set('memory_limit','1024M');
    if (!empty($_FILES)) {
        /*判断是不是excel文件*/
        $tmp_file = $_FILES ['file'] ['tmp_name'];
        $file_types = explode ( ".", $_FILES ['file'] ['name'] );
        $file_type = $file_types [count ( $file_types ) - 1];

        /*判别是不是.xls文件,判别是不是excel文件*/
        if (strtolower ( $file_type ) != "xlsx" && strtolower ( $file_type ) != "xls")
        {
            $this->error ( '不是Excel文件,重新上传' );
        }
       /*上传文件到Public/upload*/
        $config = array(
            'exts' => array('xlsx','xls'),
            'maxSize' => 3145728000,
            'rootPath' =>"./Public/",
            'savePath' => 'Uploads/',
            'subName' => array('date','Ymd'),
        );
        $upload = new \Think\Upload($config);
        if (!$info = $upload->upload()) {
            $this->error($upload->getError());
        }
        /*开始导入文件夹*/
        vendor("PHPExcel.PHPExcel");
        $file_name=$upload->rootPath.$info['file']['savepath'].$info['file']['savename'];
        $extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));//判断导入表格后缀格式
        /*数据量较大时会出现内存溢出的问题*/
        $cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
        $cacheSettings = array();
        \PHPExcel_Settings::setCacheStorageMethod($cacheMethod,$cacheSettings);
        if ($extension == 'xlsx') {
            $objReader =\PHPExcel_IOFactory::createReader('Excel2007');
            $objPHPExcel =$objReader->load($file_name, $encode = 'utf-8');
        } else if ($extension == 'xls'){
            $objReader =\PHPExcel_IOFactory::createReader('Excel5');
            $objPHPExcel =$objReader->load($file_name, $encode = 'utf-8');
        }
        $objPHPExcel = \PHPExcel_IOFactory::load($file_name);
        $sheet =$objPHPExcel->getSheet(0);
        $highestRow = $sheet->getHighestRow();//取得总行数
        $highestColumn =$sheet->getHighestColumn(); //取得总列数
        $data=$objPHPExcel->getActiveSheet()->toArray();
        //去掉第一行,因为第一行是目录
        unset($data[0]);
        $oldnum=count($data);
        $ordernos = array();
       foreach($data as $k =>$v){
           $ordernos[] = $v[0];
        }
        //excel表格去重复
        $unique_arr = array_unique ( $ordernos );
        if(count($ordernos)!=count($unique_arr)){
            $repeat_arr = array_diff_assoc ( $ordernos, $unique_arr );
            $this->error("Excel表中出现重复的订单号:{".implode(',',$repeat_arr)."},请重新检查");
        }

        //考虑订单在数据库是否已经存在
        $exinum=array();
        $order_res = M('表min')->field('orderno')->where(array('orderno'=>array('in' , $ordernos)))->select();
        //顾虑掉重复的数据
        if(count($order_res)>0){
            foreach($data as $k=>$v){
              if(in_array($v[0],array_column($order_res,"orderno"))){
                  $exiorderno[]=$v[0];
                  unset($data[$k]);
              }
            }
        }
        $count= count($data);
        if($count==0){
            $this->error("Excel表中的订单数据在数据库中都存在");
        }
        $pagesize = 1;
        $pagenum  = ceil($count/$pagesize);
        $sucnum=0;
        $errornum=0;
        $error_orderno=array();
        for($i =0 ;$i < $pagenum ; $i++){
            $start = ($i-1)*$pagesize;
            $dataList = array_slice($data,$start,$pagesize );
            $arr=array();
            foreach($dataList as $k=>$v){
                $arr[$k]['xxxx'] =$dataList[$k][0];
                $arr[$k]['xxxx'] =$dataList[$k][1];
            }
            $res=M('表名')->addAll($arr);
            if(!$res){
                $errornum+=count($dataList);
                $error_orderno[]=$dataList[$k]['0'];
            }else{
                $sucnum+=count($dataList);
            }
        }
        $exinum=count($exiorderno);
        $error_orderno=count($error_orderno)==0 ? "无": implode(',',$error_orderno);
       $this->success("Excel数据去掉第一行的目录总共{$oldnum}条,数据库已经存在的{$exinum}条分别是:{".implode(',',$exiorderno)."},成功导入的总共{$sucnum}条,出现错误:{$errornum}条,出现错误的订单号:{$error_orderno}");
        unlink($file_name);
   } else {
       $this->error("请选择上传的文件");
    }
}


猜你喜欢

转载自blog.csdn.net/coral33333/article/details/72550971
今日推荐