版本: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("请选择上传的文件"); } }