1. 程式人生 > >TP5中封裝PHPEXCEL1.8導入數據以及圖片功能

TP5中封裝PHPEXCEL1.8導入數據以及圖片功能

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導入數據以及圖片功能