tp3.2 利用PHPExcel导入excel文件并存入数据库

浏览:4892 发布日期:2017/11/06 分类:技术分享 关键字: ThinkPHP3.2 EXCEL
之前写了导出的分享帖,现在写一下导入的方法。我用的是mysql数据库。
具体思路:1.上传需要导入的文件。
2.利用PHPExcel处理导入的文件。
3.处理PHPExcel转换的数组,并存入数据库。
直接把源码都贴上。     //导入excel文件
    public function assign_excel()
    {
        $data = I('post.') ? I('post.') : I('get.');
        if(IS_File){
            if (!empty ( $_FILES)) {
                // 上传文件
                $upload = new \Think\Upload();                      // 实例化上传类
                $upload->maxSize = 10485760;                 // 设置附件上传大小
                $upload->exts = array('xls', 'xlsx');       // 设置附件上传类型
                $upload->rootPath = './Uploads/';             // 设置附件上传根目录
                $upload->autoSub = false;                         // 将自动生成以photo后面加时间的形式文件夹,关闭
                $info = $upload->upload();                                   // 上传文件
                $exts = $info['file']['ext'];                                 // 获取文件后缀
                $filename = $upload->rootPath . $info['file']['savename'];        // 生成文件路径名
                if (!$info) {                                                     // 上传错误提示错误信息
                    $this->error($upload->getError());
                } else {                                                           // 上传成功
                    import("Vendor.excel.PHPExcel");                             // 导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
                    //$PHPExcel = new \PHPExcel();                                 // 创建PHPExcel对象,注意,不能少了\
                    if ($exts == 'xls') {                                        // 如果excel文件后缀名为.xls,导入这个类
                        import("Vendor.excel.PHPExcel.Reader.Excel5");
                        $PHPReader = new \PHPExcel_Reader_Excel5();
                    } else
                        if ($exts == 'xlsx') {
                            import("Vendor.excel.PHPExcel.Reader.Excel2007");
                            $PHPReader = new \PHPExcel_Reader_Excel2007();
                        }
                    $PHPExcel = $PHPReader->load($filename);    // 载入文件
                    $currentSheet = $PHPExcel->getSheet(0);        // 获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
                    $allColumn = $currentSheet->getHighestColumn();   // 获取总列数
                    $allRow = $currentSheet->getHighestRow();              // 获取总行数
                    for ($currentRow = 0; $currentRow <= $allRow; $currentRow++) {// 循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
                        for ($currentColumn = 'A'; $currentColumn <= $allColumn; $currentColumn++) {// 从哪列开始,A表示第一列
                            $address = $currentColumn . $currentRow;             // 数据坐标
                            $ExlData[$currentRow][$currentColumn] = $currentSheet->getCell($address)->getValue();// 读取到的数据,保存到数组$ExlData中
                        }
                    }
                    unset($ExlData[0]);//清楚数组0的空值,这一组没有数据
                    unset($ExlData[1]);//excel表头,第一行
                    ini_set('max_execution_time', '500');//设置导入最大时长。
                    $arr = array_values($ExlData);//重新排序数组键名
                    foreach($arr as $k=>$v){
                        if($v["A"] != null){//不导入空值
                            //处理时间格式错误
                            import("Vendor.excel.PHPExcel.Shared.Date");
                            $shared = new \PHPExcel_Shared_Date();
                            if(trim($v["J"])=="通过"){$zt = 2;}else{$zt = 1;}
                            if(trim($v["L"])=="流标"){$zb = 0;}else{$zb = 1;}
                            if($v["C"] !=null){$c = date("Y-m-d",$shared ->ExcelToPHP($v["C"]));}else{$c=null;}
                            if($v["D"] !=null){$d = date("Y-m-d",$shared ->ExcelToPHP($v["D"]));}else{$d=null;}
                            $data['a_user'] = $v["A"];
                            $data['a_xh'] = $v["B"];
                            $data['a_btime'] =$c;
                            $data['a_itime'] =$d;
                            $data['a_dh'] = $v["E"];
                            $data['a_content'] = $v["F"];
                            $data['a_khphone'] = $v["G"];//客户联系方式
                            $data['a_dtime'] = $v["H"];
                            $data['a_fzt'] = $v["I"];//完成情况
                            $data['a_zt'] = $zt;//状态,是否审核
                            $data['a_dprice'] = $v["K"];
                            $data['a_zb'] =$zb;
                            $data['a_ftime'] = date("Y-m-d ",$shared ->ExcelToPHP($v["M"]));
                            $data['a_bz'] = $v["N"];
                            $data['a_utime'] = date("Y-m-d H:i:s",time());
                            //dump($data);exit();
                            $re = M("commit")->add($data);//导入数据库
                            if($re){
                                unset($data);
                            }else{
                                die("<script>alert('导入出错,请重试!');history.back(-1);</script>");
                            }
                        }else{
                            die("<script>alert('设计师列不能为空!');history.back(-1);</script>");
                        }
                    }
                }
            }

        }
        //删除单条
        if(I("get.del") != null){
            $map['a_id'] = I("get.a_id");
            M("commit")->where($map)->delete();
        }
        //后台管理导入任务的价格统计条件
        $map2["a_zb"] = array("neq" ,0);
        $map2["a_zt"] = 2;
        //分页
        $count = M("commit")->count(); // 查詢滿足要求的總記錄數
        $p = getpage($count, 20);
        $list = M("commit")->order('a_utime')->limit($p->firstRow, $p->listRows)->select();
        $price =M("commit")->where($map2)->sum("a_dprice");//统计检索出任务的价格
        foreach ($data as $key => $val) {// 保持分页参数
            $p->parameter[$key] = urlencode($val);
        }
        $this->assign('data', $data);// 参数保持
        $this->assign('price', $price);
        $this->assign('list', $list); // 賦值數據集
        $this->assign('page', $p->show()); // 賦值分頁輸出
        $this->display("assign/assign_excel");
    }
这里有很多坑,请注意。
1.在运行时如果报未发现xxx类,找到对应位置,更改文件名为xxx.class.php。如,未发现PHPExcel_Reader_Excel5类。则找到位置,把这个类文件名改为Excel5.class.php
2.一定要注意转换的数组,最好打印看一下。dump($ExlData);
3.最重要的是时间,一开始老是发现时间不对。phpexcel有函数转换为php的时
间戳函数。//处理时间格式错误
                            import("Vendor.excel.PHPExcel.Shared.Date");
                            $shared = new \PHPExcel_Shared_Date();
                            if($v["C"] !=null){$c = date("Y-m-d",$shared ->ExcelToPHP($v["C"]));}else{$c=null;}
                            if($v["D"] !=null){$d = date("Y-m-d",$shared ->ExcelToPHP($v["D"]));}else{$d=null;}
自己也是小白一枚,有什么问题希望大伙多多指教!
phpexcel源码百度云:http://pan.baidu.com/s/1nuEvJz7
最佳答案
评论( 相关
后面还有条评论,点击查看>>