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

首先下载下来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

时间: 2024-12-20 07:50:49

TP5中封装PHPEXCEL1.8导入数据以及图片功能的相关文章

MATLAB中文件的读写和数据的导入导出

http://blog.163.com/tawney_daylily/blog/static/13614643620111117853933/ 在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件.MATLAB使用多种格式打开和保存数据.本章将要介绍 MATLAB中文件的读写和数据的导入导出. 13.1 数据基本操作 本节介绍基本的数据操作,包括工作区的保存.导入和文件打开.13.1.1 文件的存储 MATLAB支持工作区的保存.用户可以将工作区或工作区中的变量以文件的形式保

Oracle 用中文作为关键字查询无数据及sql loader 导入数据时数据分隔异常的解决办法

前提:电脑A使用sqlldr向电脑B中的Oracle批量导入数据.数据分隔及查询都正常. 拷贝A中的源数据及ctl文件到电脑C中,拷贝B中的Oracle安装文件并安装至电脑C中. 电脑C使用ctl将源文件导入本机Oracle中之后发现.导入的数据分隔错误,比如[email protected]@ccc格式的数据,sqlldr导入的时候用@分隔.但是实际导入结果并不是column1=aaa,column2=bbb, column3=ccc:有部分数据变成了[email protected],[em

Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!

转自:http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop分布式文件系统中.Hive本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据.所以往Hive表里面导入数据只是简单的将数据移动到表所在的目录中! Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中

infobright中导入数据避免特殊字符问题

目前在用的是社区版的infobright,不支持DML功能,只能用LOAD DATA方式导入数据. 如果元数据中有特殊控制字符,导入过程中经常会报错,很是恼火.应对策略有两种方法: 设置Reject File导入之前,设定 @BH_REJECT_FILE_PATH 和 @BH_ABORT_ON_COUNT 就可以忽略多少条导入失败的记录,并且将这些记录保存在指定文件 /** when the number of rows rejected reaches 10, abort process **

mysql导入数据到oracle中

mysql导入数据到oracle中. 建立Oracle表: CREATE TABLE "GG_USER" ( "USERID" VARCHAR2(255 BYTE) NOT NULL, "ISPART" VARCHAR2(255 BYTE) DEFAULT NULL, "ACTUALPOSITIONID" NUMBER(11) DEFAULT NULL, "BEGINWORKTIME" TIMESTAMP(

使用sqoop1.4.4从oracle导入数据到hive中错误记录及解决方案

在使用命令导数据过程中,出现如下错误 sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.29.16:1521/testdb --username NAME --passord PASS --verbose -m 1 --table T_USERINFO 错误1:File does not exist: hdfs://opt/sqoop-1.4.4/lib/commons-io-1.4.jar FileNotFoundEx

solr6.6教程-从mysql数据库中导入数据(三)

整理多半天的solr6.6,终于算是把solr6.6中配置数据库弄出来了,网上的文章千篇一律,各说个的,没有一篇统一覆盖solr6.6版本配置的 帖子,本章节我会把配置的一些注意事项一一列举,由于时间原因,本片只介绍如何一次性导入数据,不附带增量导入,想看增量的同学可以在后面的文章中. 1,配置准备 本文的前提是你已经配置好了solr,并新创建了一个core,我们下面都会按照前一篇文章中的core_demo为基础开始 2,修改soreconfig.xml 在soreconfig.xml的<req

SQL从其他服务器数据库导入数据到本地数据库中

EXEC sp_dropserver 'ITSV2', 'droplogins' exec sp_addlinkedserver 'ITSV2' , '' , 'SQLOLEDB' , '168.9.123.123' exec sp_addlinkedsrvlogin 'ITSV2' , 'false' , null , 'sa' , 'sa' drop table test2; select top 12 * into test2 from ITSV2.InfoDB.dbo.city sele

oracle中使用impdp数据泵导入数据提示“ORA-31684:对象类型已经存在”错误的解决

转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/47448751 oracle中使用impdp数据泵导入数据时,假设导入之前已经创建了用户,会提示错误:"ORA-31684:对象类型已经存在".如: 事实上这个问题并不严重,能够先不创建用户,导入时指定一个超级用户导入: impdp system/123456@ORCL DIRECTORY=DUMP_EXP DUMPFILE=EXPDATA.DMP remap_sche