zoukankan      html  css  js  c++  java
  • thinkphp导入导出excel表单数据

    在PHP项目经常要导入导出Excel表单。

    先去下载PHPExcel类库文件,放到相应位置。

    我在thinkphp框架中的位置为ThinkPHP/Library/Org/Util/

    导入

    在页面上传excel文件提交到后台,利用form表单提单即可

    <form method="post" enctype="multipart/form-data" action="" >  
    <input type="submit" value="导入" />                               
    <input  type="file" name="excel" />                    
    </form>  

    提交到后台后进行上传处理,这是一个执行上传的方法

    public function data(){
            if(IS_POST){
            //设置编码防止乱码
            header("Content-Type:text/html;charset=utf-8");
                $upload = new ThinkUpload();// 实例化上传类
                $upload->maxSize   =     3145728 ;// 设置附件上传大小
                $upload->exts      =     array('xls','xlsx','csv');// 设置附件上传类
                $upload->rootPath  =     'Uploads/';
                $upload->savePath  =     ''; // 设置附件上传目录
                // 上传文件
                $info   =   $upload->uploadOne($_FILES['excel']);
                $filename = 'Uploads/'.$info['savepath'].$info['savename'];
                $exts = $info['ext'];
               // var_dump($info);
                if(!$info) {// 上传错误提示错误信息
                      $this->error($upload->geterror());
                  }else{// 上传成功
                      $this->data_import($filename, $exts);
                }          
            }
        }

    上传文件的格式设为excel的格式,xls,xlsx,csv均可支持

    然后对上传后的文件内容进行读取导入,下面是一个读取的方法。

    protected function data_import($filename, $exts='xls')
        {
            //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
            import("Org.Util.PHPExcel");
            //创建PHPExcel对象,注意,不能少了
            $PHPExcel=new PHPExcel();
            //如果excel文件后缀名为.xls,导入这个类
            if($exts == 'xls'){
                import("Org.Util.PHPExcel.Reader.Excel5");
                $PHPReader=new PHPExcel_Reader_Excel5();
            }else if($exts == 'xlsx'){
                import("Org.Util.PHPExcel.Reader.Excel2007");
                $PHPReader=new PHPExcel_Reader_Excel2007();
            }else if($exts == 'csv'){
                import("Org.Util.PHPExcel.Reader.CSV");
                $PHPReader=new PHPExcel_Reader_CSV();
            }
     
            //var_dump($PHPReader);die;
            //载入文件
            $PHPExcel=$PHPReader->load($filename);
            //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
            $currentSheet=$PHPExcel->getSheet(0);
            //获取总列数
            $allColumn=$currentSheet->getHighestColumn();
            //获取总行数
            $allRow=$currentSheet->getHighestRow();
            //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
            for($currentRow=1;$currentRow<=$allRow;$currentRow++){
                //从哪列开始,A表示第一列
                for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){
                    //数据坐标
                    $address=$currentColumn.$currentRow;
                    //读取到的数据,保存到数组$arr中
                    $data[$currentRow][$currentColumn]=$currentSheet->getCell($address)->getValue();
                }
     
            }
            $this->save_import($data);
        }

    用上面这个方法获得excel里的数据,然后用save_import把获得的数据存入数据库

    //保存导入数据
        public function save_import($data)
        {
            //print_r($data);exit;
     
            $bath = M('data');
             
            //插入新数据时先清空原表数据,没有这个需要可以注释下面步骤
            //M('mobile')->where('1=1')->delete();
             
            foreach ($data as $k=>$v){
                    //$mobile=$v['A'];   //注:****** (1)处
                    $info['a'] = $v['A'];
                    $info['b'] = $v['B'];
                    $info['c']=$v['C'];
                    $info['d_water']=$v['D'];
                    $info['e']=$v['E'];
                    $info['f']=$v['F'];
     
                    $arr[] = $info;
     
            }
            $result=$bath->addall($arr);
            if($result){
                $this->success('数据导入成功');
            }else{
                $this->error('数据导入失败');
            }
            //print_r($info);
        }

    导出相对于导入就容易的多,从数据库读出数据做出相应的处理

    public function excel(){
            //引入PHPExcel库文件
            Vendor('PHPExcel.Classes.PHPExcel');
            //创建对象
            $excel = new PHPExcel();
            //Excel表格式,这里简略写了8列
            $letter = array('A','B','C','D','E','F','F','G');
            //表头数组
            $tableheader = array('序号','客栈名称','客栈地址','座机','手机','QQ','邮箱');
            //填充表头信息
            for($i = 0;$i < count($tableheader);$i++) {
                $excel->getActiveSheet()->setCellValue("$letter[$i]1","$tableheader[$i]");
            }
            //表格数组
            $data = array(
                    array('1','B','C','D','E','F','G'),
                    array('2','B','C','D','E','F','G'),
                    array('3','B','C','D','E','F','G'),
                    array('4','B','C','D','E','F','G'),
                    array('5','B','C','D','E','F','G'),
                    array('6','B','C','D','E','F','G'),
                   array('7','B','C','D','E','F','G'),
            );
            //填充表格信息
            for ($i = 2;$i <= count($data) + 1;$i++) {
                $j = 0;
                foreach ($data[$i - 2] as $key=>$value) {
                    $excel->getActiveSheet()->setCellValue("$letter[$j]$i","$value");
                    $j++;
                }
            }
            //创建Excel输入对象
            $write = new PHPExcel_Writer_Excel5($excel);
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
            header("Content-Type:application/force-download");
            header("Content-Type:application/vnd.ms-execl");
            header("Content-Type:application/octet-stream");
            header("Content-Type:application/download");;
            header('Content-Disposition:attachment;filename="客栈信息.xls"');
            header("Content-Transfer-Encoding:binary");
            $write->save('php://output');
        


    前台页面只需要执行此方法即可

  • 相关阅读:
    php RabbitMQ使用
    phalcon: 开启模板缓存和缓存路径
    phalcon:整合官方多模块功能,方便多表查询
    mysql: 模糊查询 feild like keyword or feild like keyword , concat(feild1,feild2,feild3) like keyword
    php的http数据传输get/post...
    java大数字操作:BigInteger,BigDecimal(浮点型)
    DecimalFormat数据格式函数
    MySQL比like语句更高效的写法locate position instr find_in_set
    mysql中使用instr替换like
    mysql中的多行查询结果合并成一个
  • 原文地址:https://www.cnblogs.com/suiyuewuxin/p/6236305.html
Copyright © 2011-2022 走看看