thinkphp---Excel导入!
在做项目的时候,很多时候会遇到需要将excel导入到数据库的操作:
需要用到Excel类:
下载地址:
https://gitee.com/meiyouzhanghao/excel
位置:Thinkphp / Library / Org / Util
获取Excel 方法:
//获取excel文件、读取数据方法 public function getdata($file_name,$exts='xls'){ //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入 import("Org.Util.PHPExcel", '', '.php'); //创建PHPExcel对象,注意,不能少了\ $PHPExcel=new \PHPExcel(); import("Org.Util.PHPExcel.Reader.Excel5",'','.php'); $PHPReader=new \PHPExcel_Reader_Excel5(); //载入文件 $PHPExcel=$PHPReader->load($file_name); //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推 $currentSheet = $PHPExcel->getSheet(0); //获取总列数 $allColumn = $currentSheet->getHighestColumn(); //获取总行数 $allRow = $currentSheet->getHighestRow(); $excelData = array(); //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始 for($currentRow = 2; $currentRow <= $allRow; $currentRow ++){ //从哪列开始,A表示第一列 for($currentColumn='B';$currentColumn<=$allColumn;$currentColumn++){ //数据坐标 $address=$currentColumn.$currentRow; //读取到的数据,保存到数组$arr中 $excelData[$currentRow][$currentColumn] = $currentSheet-> getCell($address)-> getValue(); } } return $excelData; }
导入操作:
public function test(){ $filePath = "./Uploads/201111.xls"; $data = $this->getdata($filePath); pd($data); // 得到数据 批量循环插入 $UserDB = M('user'); foreach($data as $k=>$v){ $data = array(); $data['name'] = $v['B']; $data['age'] = $v['C']; $data['city'] = $v['D']; // $UserDB->add($data); } }
需要导入的Excle.xls
上面 $data = $this->getdata($filePath); 获取的数据:
参考:导入操作
//导入Excel方法操作 public function importExp(){ header("Content-type: text/html;charset=utf-8");//设置页面内容是html编码格式是utf-8 $m=D("Webinfo");//连接数据表 $cell=array(); //导入Excel前要上传Excel文件到项目文件夹,如果成功进行,如果失败提示错误信息 //I('post.ExcelURL','','htmlspecialchars')为获取上传控件传来的文件名称 if(I('post.ExcelURL','','htmlspecialchars')!=""){ $uploads="Uploads"; $upload = new \Think\Upload();// 实例化上传类 $upload->maxSize = 5242880 ;// 设置附件上传大小 $upload->exts = array('xlsx','xls');// 设置附件上传类型 $upload->rootPath = './'.$uploads.'/'; // 设置附件上传根目录 $upload->subName = array('date','Ym'); // 上传单个文件 $info = $upload->uploadOne($_FILES['excel']); if(!$info) {// 上传错误提示错误信息 $this->error($upload->getError()); }else{ //上传Excel成功 $exts = $info['ext']; $file_name=$uploads.'/'.$info['savepath'].$info['savename']; $res=$this->getdata($file_name,$exts); //循环读取每行数据,进行写入数据库 foreach ( $res as $k => $v ) { if ($k != 0) { //获取数据库中的最大ID自增加1 $m->create(); $id=$m->max('ID'); if($id==0||$id==NULL||$id==""){ $id=1; } else { $id=$id+1; } //读取数据后赋给数组data $data['ID']=$id; $data ['Name'] = $v [B]; $data ['Site'] = $v [C]; $result = $m->add($data);//添加操作 } } if($result!=0){ $this->success('网站数据导入成功'); }else{ $this->error('网站数据导入失败'); } } } else { $this->error("请选择上传的文件"); } }
导出 Excel:
数据结构:
具体方法:
public function testOne(){ $UserDB = M('user'); $UserList = $UserDB->select(); $filename = "用户信息表"; $header = array('id','名字','年纪','城市'); $this->getExcel($filename,$header,$UserList);//调用导出引用方法 }
具体导出方法:
//导出引用方法 public function getExcel($fileName,$headArr,$data){ //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入 import("Org.Util.PHPExcel", '', '.php'); import("Org.Util.PHPExcel.Writer.Excel5",'','.php'); import("Org.Util.PHPExcel.IOFactory.php"); $date = date("Y_m_d",time()); $fileName .= "_{$date}.xls"; //创建PHPExcel对象,注意,不能少了\ $objPHPExcel = new \PHPExcel(); $objProps = $objPHPExcel->getProperties(); //设置表头 $key = ord("A"); //print_r($headArr);exit; foreach($headArr as $v){ $colum = chr($key); $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v); $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v); $key += 1; } $column = 2; $objActSheet = $objPHPExcel->getActiveSheet(); //print_r($data);exit; foreach($data as $key => $rows){ //行写入 $span = ord("A"); foreach($rows as $keyName=>$value){// 列写入 $j = chr($span); $objActSheet->setCellValue($j.$column, $value); $span++; } $column++; } $fileName = iconv("utf-8", "gb2312", $fileName); //重命名表 //$objPHPExcel->getActiveSheet()->setTitle('test'); //设置活动单指数到第一个表,所以Excel打开这是第一个表 $objPHPExcel->setActiveSheetIndex(0); ob_end_clean();//清除缓冲区,避免乱码 header('Content-Type: application/vnd.ms-excel'); header("Content-Disposition: attachment;filename=\"$fileName\""); header('Cache-Control: max-age=0'); $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); //文件通过浏览器下载 exit; }
导出方法示例:
//全部导出数据方法 public function allExp(){ //链接所导出的数据表 $xlsModel = D('Webinfo'); //“WID,WName,WebSite,Remark”为所查询的字段,“Status=2”查询条件 $goods_list = $xlsModel->relation(TRUE)->field('WID,WName,WebSite,Remark')->where('Status=2')->select(); $count=1;//导出Excel序号排列 $data = array(); //循环查询后的数据,进行每一列 foreach ($goods_list as $k=>$goods_info){ $data[$k][ID] = $count++;//序号列 $data[$k][Name] = $goods_info['Name'];//名称列 $data[$k][ebSite] = $goods_info['Site'];//地址列 $data[$k][Remark] = $goods_info['Remark'];//备注列 } //每列表的名称 foreach ($data as $field=>$v){ if($field == 'ID'){ $headArr[]='序号'; } if($field == 'Name'){ $headArr[]='名称'; } if($field == 'Site'){ $headArr[]='网址'; } if($field == 'Remark'){ $headArr[]='备注'; } } $filename="网站信息数据表";//所导出的保存文件名称 $sss=$this->getExcel($filename,$headArr,$data);//调用导出引用方法 }