TP5中封裝PHPEXCEL1.8導入數據以及圖片功能
阿新 • • 發佈:2017-09-12
phpexcel1.8 php導入excel php批量導入圖片
首先下載下來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
本文出自 “為了以後” 博客,謝絕轉載!
TP5中封裝PHPEXCEL1.8導入數據以及圖片功能