您的位置:首页 > 编程语言 > PHP开发

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

2017-09-12 11:26 561 查看
首先下载下来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中图片
*
* @param string $file_name 文件名
* @param string $full_path 文件完整路径
*/
function process_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');
}
else if(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;
}

/**
* 返回文件路径的信息
*
* @param string $file_name
* @return string
*/
function getExtendFileName($file_name) {

$extend = pathinfo($file_name);
$extend = strtolower($extend["extension"]);
return $extend;
}

/**
* worksheet中提取image
*
* @param object $worksheet
* @param string $basePath
*/
function extractImageFromWorksheet($worksheet,$basePath){

$result = array();

$imageFileName = "";

foreach ($worksheet->getDrawingCollection() as $drawing) {
$xy=$drawing->getCoordinates();
$path = $basePath;
// for xlsx
if ($drawing instanceof \PHPExcel_Worksheet_Drawing) {

$filename = $drawing->getPath();

$imageFileName = $drawing->getIndexedFilename();

// 可能是office版本的缘故,获取出来的图片文件名字
// 很容易造成文件名重复导致图片被覆盖,这里做了一下
// 处理对图片名字进行微秒的md5处理。
// process imageFileName
$tmp = explode(".", $imageFileName);
$tmp[0] = md5(microtime(true));
$tmp_fileName = implode(".", $tmp);
// process imageFileName

// $path = $path . $drawing->getIndexedFilename();
$path = $path . $tmp_fileName;

$boo = copy($filename, $path);

$result[$xy] = $path;

// for xls
} else if ($drawing instanceof \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;
}


控制器中处理表格数据&图片并导入数据库表中:
    /**
* 批量导入老师
*
*/
public function t_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_arr as $key=>$value) { // 教师记录信息
if ($this->_model->where("code='$value[B]'")->find()) {
$user_repeat++;
echo "重复的记录:";
var_dump("$value[B]");
echo "\r\n";
} else {
// 图片处理start
foreach ($image_info as $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-d H:i:s"),
'changedtime' => date("Y-m-d H: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

附件:http://down.51cto.com/data/2366981
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 导入 PHPEXCEL