thinkphp如何做到导出,导入大文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp如何做到导出,导入大文件相关的知识,希望对你有一定的参考价值。

参考技术A 跟框架没关系,思想就是循环逐步导入导出,防止内存爆

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 \Think\Upload();// 实例化上传类
            $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‘);
    


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


以上是关于thinkphp如何做到导出,导入大文件的主要内容,如果未能解决你的问题,请参考以下文章

mysql 的sql文件太大怎么导入

如何在mysql中批量导入大的sql文本文件

ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例

thinkphp5 使用PHPExcel 导入导出

用php导入10W条+ 级别的csv大文件数据到mysql。导出10W+级别数据到csv文件

POI实现大数据EXCLE导入导出,解决内存溢出问题