首先下载下来PHPEXCEL1.8的类库(https://github.com/PHPOffice/PHPExcel)放到项目目录下面的extend下面即可。
650) this.width=650;" src="https://s1.51cto.com/wyfs02/M01/A5/0F/wKioL1m3SKnDldviAAEEV3wocLs331.jpg" title="PHPEXCEL1.8.jpg" alt="wKioL1m3SKnDldviAAEEV3wocLs331.jpg" />
由于PHPEXCEL没有使用命名空间(namespace)的模式,所以在使用的只能使用全路径引入了。
//引入PHPEXCEL类库import(‘PHPExcel_IOFactory‘,EXTEND_PATH."PhpExcel/PHPExcel/");import(‘PHPExcel‘,EXTEND_PATH."PhpExcel/");
使用到的Excel表格数据:
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M02/A5/10/wKioL1m3USqwCyFnAAHs9SVNftE383.jpg" title="Teacher-info.jpg" alt="wKioL1m3USqwCyFnAAHs9SVNftE383.jpg" />
处理图片用到的功能函数我放到了common.php公共文件里面:
PHPEXCEL类库里面已经涵盖了下面几个函数,但对处理表格里面的图片的时候并不好用,所以就提取出来放到公共文件里面了。
//应用公共文件define(‘EXCEL_EXTENSION_2003‘,"xls");define(‘EXCEL_EXTENSION_2007‘,"xlsx");/***处理Excel中图片**@paramstring$file_name文件名*@paramstring$full_path文件完整路径*/functionprocess_excel_image($file_name,$full_path){//引入PHPEXCEL类import(‘PHPExcel_IOFactory‘,EXTEND_PATH."PhpExcel/PHPExcel/");import(‘PHPExcel‘,EXTEND_PATH."PhpExcel/");//判断文件版本,选择对应的解析文件if(getExtendFileName($file_name)==EXCEL_EXTENSION_2003){$reader=\PHPExcel_IOFactory::createReader(‘Excel5‘);}elseif(getExtendFileName($file_name)==EXCEL_EXTENSION_2007){$reader=new\PHPExcel_Reader_Excel2007();}//解析Excel文件//$objPHPExcel=$objReader->load(ROOT_PATH."public/uploads/".$file_path);$PHPExcel=$reader->load($full_path);$worksheet=$PHPExcel->getActiveSheet();$imageInfo=extractImageFromWorksheet($worksheet,ROOT_PATH."public/uploads/school/");return$imageInfo;}/***返回文件路径的信息**@paramstring$file_name*@returnstring*/functiongetExtendFileName($file_name){$extend=pathinfo($file_name);$extend=strtolower($extend["extension"]);return$extend;}/***worksheet中提取image**@paramobject$worksheet*@paramstring$basePath*/functionextractImageFromWorksheet($worksheet,$basePath){$result=array();$imageFileName="";foreach($worksheet->getDrawingCollection()as$drawing){$xy=$drawing->getCoordinates();$path=$basePath;//forxlsxif($drawinginstanceof\PHPExcel_Worksheet_Drawing){$filename=$drawing->getPath();$imageFileName=$drawing->getIndexedFilename();//可能是office版本的缘故,获取出来的图片文件名字//很容易造成文件名重复导致图片被覆盖,这里做了一下//处理对图片名字进行微秒的md5处理。//processimageFileName$tmp=explode(".",$imageFileName);$tmp[0]=md5(microtime(true));$tmp_fileName=implode(".",$tmp);//processimageFileName//$path=$path.$drawing->getIndexedFilename();$path=$path.$tmp_fileName;$boo=copy($filename,$path);$result[$xy]=$path;//forxls}elseif($drawinginstanceof\PHPExcel_Worksheet_MemoryDrawing){$image=$drawing->getImageResource();$renderingFunction=$drawing->getRenderingFunction();switch($renderingFunction){case\PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG:$imageFileName=$drawing->getIndexedFilename();$path=$path.$drawing->getIndexedFilename();imagejpeg($image,$path);break;case\PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF:$imageFileName=$drawing->getIndexedFilename();$path=$path.$drawing->getIndexedFilename();imagegif($image,$path);break;case\PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG:$imageFileName=$drawing->getIndexedFilename();$path=$path.$drawing->getIndexedFilename();imagegif($image,$path);break;case\PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT:$imageFileName=$drawing->getIndexedFilename();$path=$path.$drawing->getIndexedFilename();imagegif($image,$path);break;}$result[$xy]=$imageFileName;}}return$result;}
控制器中处理表格数据&图片并导入数据库表中:
/***批量导入老师**/publicfunctiont_bulk_add(){//学校id$s_id=session(‘s_id‘);if($this->request->method()=="POST"){//获取表单上传文件例如上传了001.jpg$file=request()->file(‘excel‘);//移动到框架应用根目录/public/uploads/目录下$info=$file->validate([‘size‘=>5242880,‘ext‘=>‘xls,xlsx,csv‘])->move(ROOT_PATH.‘public‘.DS.‘uploads‘);if($info){$file_path=$info->getSaveName();$file_name=$info->getFileName();//引入PHPEXCEL类库import(‘PHPExcel_IOFactory‘,EXTEND_PATH."PhpExcel/PHPExcel/");import(‘PHPExcel‘,EXTEND_PATH."PhpExcel/");//判断文件版本,选择对应的解析文件if(‘xlsx‘==$info->getExtension()){import(‘PHPExcel_Reader_Excel2007‘,EXTEND_PATH."PhpExcel/PHPExcel/Reader/");$objReader=\PHPExcel_IOFactory::createReader(‘Excel2007‘);}else{import(‘PHPExcel_Reader_Excel5‘,EXTEND_PATH."PhpExcel/PHPExcel/Reader/");$objReader=\PHPExcel_IOFactory::createReader(‘Excel5‘);}$full_path=ROOT_PATH."public/uploads/".$file_path;//解析Excel文件$objPHPExcel=$objReader->load($full_path);//读取第一个工作表(编号从0开始)$sheet=$objPHPExcel->getSheet(0);//取得总行数$highestRow=$sheet->getHighestRow();//取得总列数$highestColumn=$sheet->getHighestColumn();//循环读取excel文件,读取一条,插入数组一条for($j=3;$j<=$highestRow;$j++){for($k=‘A‘;$k<=$highestColumn;$k++){//读取单元格$examPaper_arr[$j][$k]=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();}}//从Excel提取images$image_info=process_excel_image($file_name,$full_path);//导入成功总数$sum=0;//重复总数$user_repeat=0;$error_num=0;//开启事务//Db::startTrans();//try{foreach($examPaper_arras$key=>$value){//教师记录信息if($this->_model->where("code=‘$value[B]‘")->find()){$user_repeat++;echo"重复的记录:";var_dump("$value[B]");echo"\r\n";}else{//图片处理startforeach($image_infoas$kk=>$vv){$kk_new=substr($kk,-1);if($kk_new==$key){//获取图片名字&拼接URL$path_parts=pathinfo($vv);$basename=$path_parts[‘basename‘];$ima=\think\Image::open($vv);//将图片裁剪为300x300并保存为crop.png//$ima->crop(300,300,100,30)->save(ROOT_PATH."public/uploads/crop$kk.png");$ima->thumb(600,600)->save(ROOT_PATH."public/uploads/teacher/$basename");$full_image_path=SITE_URL."teacher/"."$basename";$img_id=Db::name(‘image‘)->insertGetId(["url"=>"$full_image_path",‘createdtime‘=>date("Y-m-dH:i:s"),‘changedtime‘=>date("Y-m-dH:i:s")]);$data[‘image‘]=$img_id?$img_id:0;}}//图片处理end//处理带班if($value[‘F‘]==‘是‘){//$class_grade_info=$this->classGradeModel->where("remark=‘$value[G]‘")->find();$class_grade_info=Db::name("class_grade")->where("remark=‘$value[G]‘")->find();if($class_grade_info){$data[‘c_g_id‘]=$class_grade_info[‘id‘];}else{return$this->error("班级名称不存在");}}else{$data[‘c_g_id‘]=2;}$data[‘realname‘]=empty($value[‘A‘])?0:$value[‘A‘];$data[‘code‘]=empty($value[‘B‘])?0:$value[‘B‘];$data[‘gender‘]=($value[‘D‘]==‘男‘)?1:0;$data[‘telphone‘]=empty($value[‘E‘])?0:$value[‘E‘];$data[‘is_foreman‘]=empty($value[‘F‘])?2:(($value[‘F‘]=="是")?1:2);$data[‘remark‘]=empty($value[‘E‘])?0:$value[‘E‘];$data[‘profession‘]=empty($value[‘H‘])?0:$value[‘H‘];$data[‘s_id‘]=$s_id;$data_2_arr[]=$data;}}$teacher_id_new=$this->_model->saveAll($data_2_arr);if($teacher_id_new){$sum++;}else{$error_num++;}//}catch(\Exception$e){//echo$e->getMessage();////事务回滚////Db::rollback();//}echo"上传结束\r\n导入成功:".count($data_2_arr).";\r\n重复总数:".$user_repeat."\r\n失败条数:".$error_num;die;}else{//上传失败获取错误信息return$this->error($file->getError());}}else{return$this->fetch();}}
关于表格里面有图片导入的,会单独放到一篇文章里面
(http://tengteng412.blog.51cto.com/4751263/1964539)
参考文章:
http://blog.csdn.net/nagecomeontom/article/details/17397317
http://php2012web.blog.51cto.com/5585213/1620057
本文出自 “为了以后” 博客,谢绝转载!
TP5中封装PHPEXCEL1.8导入数据以及图片功能
原文地址:http://tengteng412.blog.51cto.com/4751263/1964556