thinkphp phpexcel导入

上次做了一个基于tp3.2.3的phpexcel导出,这次是phpexcel导入,准备材料phpexcel(不知道下载地址的查看我上一篇博文),虽说是基于thinkphp3.2.3来的,也只不过是引入phpexcel用了tp框架的引入方式而已,其他都是适用于任何代码的,闲话不多说,上代码。

两个步骤

1、上传页面:和普通文件上传一样,这里就不附代码了(不知道的童鞋,补补html/css)

2、数据处理-》插入数据库操作,(单sheet表格)

    public function import(){
        if(empty ( $_FILES ['excel'] ['name'] )){
            exit( '请上传excel文件' );
        }else{
            $tmp_file = $_FILES ['excel'] ['tmp_name'];
            $file_types = explode ( ".", $_FILES ['excel'] ['name'] );
            $file_type = $file_types [count ( $file_types ) - 1];
            //判别是不是.xls文件,判别是不是excel文件
            if (strtolower ( $file_type ) != "xls"){
                  exit( '不是Excel文件,重新上传' );
            }
            //设置上传路径
            $savePath = './Public/excel/';
            if(!file_exists($savePath)){
                 exit( 'excel目录不存在!');
            }


            //以时间来命名上传的文件
            $str = date ( 'Ymdhis' ); 
            $file_name = $str . "." . $file_type;
            //是否上传成功
            if (!move_uploaded_file($tmp_file,$savePath.$file_name)){
                  exit ( '上传失败' );
            }

            Vendor('PHPExcel.Classes.PHPExcel.IOFactory'); //引入phpexcel

            //获取excel文件内容生成数组
            $objReader = \PHPExcel_IOFactory::createReader('Excel5');
            $objReader->setReadDataOnly(true);
            $objPHPExcel = $objReader->load($savePath.$file_name); //载入上传的excel

            $objWorksheet = $objPHPExcel->getSheet(0);
            $highestRow = $objWorksheet->getHighestRow();
            $highestColumn = $objWorksheet->getHighestColumn();
            $highestColumnIndex = \PHPExcel_Cell::columnIndexFromString($highestColumn);

            $excelData = array();
            for ($row = 1; $row <= $highestRow; $row++) {
                for ($col = 0; $col < $highestColumnIndex; $col++) {
                    $excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
                }
            }
                               
                              
            //此处打印$excelData可查看是否有数据


            //数组重组
            $data = array();
            foreach ($excelData as $k=>$v){
                $count = count($v);
                for($i = 0;$i < $count;$i++){
                    $data[$k][$excelData['1'][$i]] = $v[$i];                           
                }                       
            }

            $newData = array();
            //再次重组数组,写入数据库
            foreach($data as $k=>$v){                    
                $newData[$k]['order_sn'] = $data[$k]['订单号'];
                $newData[$k]['goods_num'] = $data[$k]['商品编号'];
                $newData[$k]['goods_name'] = $data[$k]['商品名称'];
                $newData[$k]['goods_price'] = $data[$k]['商品单价'];
                $newData[$k]['order_totalprice'] = $data[$k]['订单总额'];
                $newData[$k]['order_time'] = $data[$k]['下单时间'];
            }

            //此处打印$newData,即能明白,以下为数据库插入操作,省略
      ........................
echo('上传成功!'); } }

测试文档就不上传了,示例中的字段等是根据我的数据库字段和测试文档来的,童鞋们测试的时候请注意区分,此例为excel单表格单一sheet上传,下面是多sheet上传,其实也差不多,只是多了几个步骤

3、数据处理-》插入数据库操作,(多sheet表格)

    public function import(){
        if(empty ( $_FILES ['excel'] ['name'] )){
            exit( '请上传excel文件' );
        }else{
            $tmp_file = $_FILES ['excel'] ['tmp_name'];
            $file_types = explode ( ".", $_FILES ['excel'] ['name'] );
            $file_type = $file_types [count ( $file_types ) - 1];
            //判别是不是.xls文件,判别是不是excel文件
            if (strtolower ( $file_type ) != "xls"){
                  exit( '不是Excel文件,重新上传' );
            }
            //设置上传路径
            $savePath = './Public/excel/';
            if(!file_exists($savePath)){
                 exit( 'excel目录不存在!');
            }

            //以时间来命名上传的文件
            $str = date ( 'Ymdhis' ); 
            $file_name = $str . "." . $file_type;
            //是否上传成功
            if (!move_uploaded_file($tmp_file,$savePath.$file_name)){
                  exit ( '上传失败' );
            }

            Vendor('PHPExcel.Classes.PHPExcel.IOFactory'); //引入phpexcel

            //获取excel文件内容生成数组
            $objReader = \PHPExcel_IOFactory::createReader('Excel5');
            $objReader->setReadDataOnly(true);
            $objPHPExcel = $objReader->load($savePath.$file_name); //载入上传的excel


            $sheetCount = $objPHPExcel->getSheetCount();    //获取excel中有个sheet表格           
            for($j=0;$j<$sheetCount;$j++){
                $objWorksheet = $objPHPExcel->getSheet($j);
                $highestRow = $objWorksheet->getHighestRow();
                $highestColumn = $objWorksheet->getHighestColumn();
                $highestColumnIndex = \PHPExcel_Cell::columnIndexFromString($highestColumn);

                $excelData = array();
                for ($row = 1; $row <= $highestRow; $row++) {
                    for ($col = 0; $col < $highestColumnIndex; $col++) {
                        $excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
                    }
                }
                                   
                                  
                //此处打印$excelData可查看是否有数据


                //数组重组
                $data = array();
                foreach ($excelData as $k=>$v){
                    $count = count($v);
                    for($i = 0;$i < $count;$i++){
                        $data[$k][$excelData['1'][$i]] = $v[$i];                           
                    }                       
                }

                $newData = array();
                //再次重组数组,写入数据库
                foreach($data as $k=>$v){                    
                    $newData[$k]['order_sn'] = $data[$k]['订单号'];
                    $newData[$k]['goods_num'] = $data[$k]['商品编号'];
                    $newData[$k]['goods_name'] = $data[$k]['商品名称'];
                    $newData[$k]['goods_price'] = $data[$k]['商品单价'];
                    $newData[$k]['order_totalprice'] = $data[$k]['订单总额'];
                    $newData[$k]['order_time'] = $data[$k]['下单时间'];
                }

                //数据库插入操作,以下省略……
                
            }
            echo('上传成功!');

        }
    
    }

其实不管是单sheet表格还是多sheet表格,都是类似的,只是多处理了几步而已,文中示例稍微简单了些,只是给童鞋们介绍这个流程和原理,具体的要根据自己实际情况来操作。

 

posted on 2016-09-20 14:38  冬天的小萝卜  阅读(280)  评论(0)    收藏  举报