使用thinkphp框架实现Excel导入数据库
之前讲过php实现Excel导出数据库的随笔,链接:https://www.cnblogs.com/nuanai/p/6727711.html
之前的项目用到较多的就是Excel导出,现在用到了Excel导入,就来把我的经验和过程记录一下。 作者:悦~ 博客地址:https://www.cnblogs.com/nuanai/
在导出中说的那个phpExcel的插件,可以继续使用。因为我用的是thinkphp的框架做的导入数据库功能,接下来是我的过程,请大家多多指教。
1.将下载下来的PHPExcel的包放置到自己项目中的thinkphp的里面,放置路径:ThinkPHP\Library\Vendor\PHPExcel文件夹和PHPExcel.php文件,截图如下:
2.放置好了之后就可以进行控制器和视图页面的编写了。首先我是先写的前端页面,在Home的视图文件夹里面的Dao的控制器的dao模板进行视图的编写,代码如下:
<!--action是跳转到的控制器的方法名字,用controller+方法名字,这是我常用的--> <form action="__CONTROLLER__/daopei" method="post" enctype="multipart/form-data" style="width: 300px; float: left;"> <div class="layui-field-box"> <div class="layui-form-item" style="float: left;"> <!--因为是要上传文件,所以这里的type类型是file类型,我给了一个name名字,因为name控制器要用到--> <input type="file" name="dao" multiple="multiple" style="width: 200px;"> </div> <div class="layui-form-item"> <div class="layui-input-block"> <!--提交按钮--> <input type="submit" value="导入配包" /> </div> </div> </div> </form>
3.视图页面写完了之后就是写我的控制器的方法了,在Home的控制器的文件夹中创建与视图名字相同的控制器名字DaoController.class.php,daopei的方法逻辑如下:
(1)视图的name传过来的值,判断File是否为空
(2)如果不为空,实例化上传类,指定上传类的一些属性值,比如:上传文件类型、文件大小,文件的保存路径等
(3)接收前面的文件,给文件进行起名
(4)判断前面传过来的值有没有错误,如果没有就进行下一步
(5)导入PHPExcel类库,创建PHPExcel对象,excel文件后缀名为.xls或.xlsx分别导入不同的类
(6)然后读取excel表的内容,然候判断表中的数据有没有和数据库中冲突的
具体的代码如下:
public function daopei(){ if (!empty($_FILES)){ $upload = new \Think\Upload();// 实例化上传类 $upload->maxSize=2097152 ;// 设置附件上传大小 $upload->exts=array('xls','xlsx'); // 设置附件上传类型 $upload->rootPath ="./Public/"; //根路径 $upload->savePath="Excel/"; // 设置附件上传目录 //$upload->saveName = time().rand(0000,9999); // 上传文件 $info = $upload->uploadOne($_FILES["dao"]); $exts = $info['ext']; $filename = '.'.'/'.'Public'.'/'.$info['savepath'].$info['savename']; // 获取文件后缀 //$filename = $upload->rootPath.$info['savePath'].$info['savename']; // 生成文件路径名 if(!$info) { // 上传错误提示错误信息 $this->error($upload->getError()); }else{ vendor("PHPExcel"); // 导入PHPExcel类库 $PHPExcel = new \PHPExcel(); // 创建PHPExcel对象,注意,不能少了\ if ($exts == 'xls') { // 如果excel文件后缀名为.xls,导入这个类 vendor("PHPExcel.PHPExcel.Reader.Excel5"); $PHPReader = new \PHPExcel_Reader_Excel5(); }else if($exts == 'xlsx') { vendor("PHPExcel.PHPExcel.Reader.Excel2007"); $PHPReader = new \PHPExcel_Reader_Excel2007(); } $PHPExcel=$PHPReader->load($filename); $currentSheet = $PHPExcel->getSheet(0); // 获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推 $allColumn = $currentSheet->getHighestColumn(); // 获取总列数 $allRow = $currentSheet->getHighestRow(); // 获取总行数 $data=array(); for($j=1;$j<=$allRow;$j++){ //从A列读取数据 for($k='A';$k<=$allColumn;$k++){ // 读取单元格 $data[$j][]=$PHPExcel->getActiveSheet()->getCell("$k$j")->getValue(); } } for ($i = 2; $i <= $allRow; $i++) { $ztime = time(); $timee = microtime($ztime); //数据库中的字段名和excel表中的字段 $data_p['bid'] = $PHPExcel->getActiveSheet()->getCell("A" . $i)->getValue(); $data_p['name'] = $PHPExcel->getActiveSheet()->getCell("B" .$i)->getValue(); $data_p['money'] = $PHPExcel->getActiveSheet()->getCell("C" .$i)->getValue(); $data_p['smoney'] = $PHPExcel->getActiveSheet()->getCell("D" . $i)->getValue(); if($PHPExcel->getActiveSheet()->getCell("E" .$i)->getValue() == FALSE){ $data_p['sel'] = 0; }else{ $data_p['sel'] = 1; } $data_p['sid'] = $PHPExcel->getActiveSheet()->getCell("F" .$i)->getValue(); $data_p['sname'] = $PHPExcel->getActiveSheet()->getCell("G" . $i)->getValue(); $data_p['snum'] = $PHPExcel->getActiveSheet()->getCell("J" . $i)->getValue(); $data_p['time'] = $PHPExcel->getActiveSheet()->getCell("M" . $i)->getValue(); $data_p['hao'] = $PHPExcel->getActiveSheet()->getCell("N" . $i)->getValue(); $data_p['dtime'] = $timee; //判断excel表中的值有没有和数据库中相同的 $result = M('dao')->where ("hao='{$data_p['hao']}'")->field('hao')->find(); if (empty($result['hao'])) { $ex = M('dao')->add($data_p); } //$ex=M('dao')->add($data_p); } //判断语句是否执行成功 if($ex){ $this->success("导入成功"); }else{ $this->error("导入失败,可能数据已存在");// 提示错误 } } }else { $this->display(); } }
4.以上逻辑就是thinkphp的Excel的导入功能,其中重点的就是phpExcel的包的使用,其他的就是正常的语句
5.导入时的判断有没有相同的值,我是根据序号来进行判断的,因为无论怎么导入,我这边的Excel表以前导入的东西是不会删除的,那样序号是不会被别的东西代替,这样导入的时候就不会因为序号的问题出错了。
6.正常的thinkphp的使用这边就不多作介绍了。希望可以对导入的小伙伴有帮助。
求大神指教:有没有做过phpword导入数据库的伙伴们,我想学习一下,可以给我留言,或者留下博客地址,谢谢