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如何做到导出,导入大文件的主要内容,如果未能解决你的问题,请参考以下文章
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例