TP5中封装PHPEXCEL1.8导入数据以及图片功能

2017-09-13 10:27:17来源:http://tengteng412.blog.51cto.com/4751263/1964556作者:人点击

分享

首先下载下来PHPEXCEL1.8的类库(https://github.com/PHPOffice/PHPExcel)放到项目目录下面的extend下面即可。

由于PHPEXCEL没有使用命名空间(namespace)的模式,所以在使用的只能使用全路径引入了。

//引入PHPEXCEL类库
import('PHPExcel_IOFactory',EXTEND_PATH."PhpExcel/PHPExcel/");
import('PHPExcel',EXTEND_PATH."PhpExcel/");

使用到的Excel表格数据:

处理图片用到的功能函数我放到了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;
//forxlsx
if($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{
//图片处理start
foreach($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


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台