织梦CMS二次开发批量导入excel数据原理:通过查询excel,把数据一条一条的读取出,然后,通过我们研发的php程序把数据导入到表中里面。
通过上面的原理我们晓得,我们可以把批量引入excel数据分成两部分,一部分是研发出来从excel读取数据的程序,另一部分是研发出来把读取出来的数据插入到数据库表中dede_archives里面。
从excel读取数据程序开发
其实,这一步有一个老外已经帮忙我们研发不好了,这个老外研发了一套专门加载excel数据表的程序叫做PHPExcel类库。
这个excel类库还包括其它的一些功能,这里不一一了解,您可以下载去看一看,这里只对加载excel进行讲解。
把读取出的数据插入至主表dede_archives里面
当通过PHPExcel类库里面提供的类读取数据后,这一步就是把数据插入到数据库表中里面,所以,这一个教程的研发其实就是在开发这一部分 ; 把从excel加载出的数据插入到主表中的程序开发。
为了讲解方便,我们把填入数据库表的数据的文件名叫做excelinert.php ,下面就在这个文件里面进入程序开发,把读取出来的数据填入至数据库表中。
填入数据研发原理
1)开发前的准备工作:
在excelinsert.php里面重新加入一个header头的编码,目的就是为了统一编码以免出现乱码:header("Content-type:text/html;charset=utf8");
导入织梦系统的公共文件common.inc.php,为什么必须导入这个文件,我们在填入数据库表前,首页要相连接网站的数据库,如果不连接将无法填入数据库数据。要注意,引入文件的路径要改成您自己的,因为,我把织梦系统安装在了dedecms里面,所以,路径中存有这个目录名称dedecms,如果您安装在根目录的话就换成这个路径。
设置错误报告、设置时区、设置程序运行时间,当然,这个运行时间可以不设置、设置PHPExcel类的类库存路径,然后,导入IOFactory.php文件,这个文件就是最重要的,本功能就是通过这个文件去处置的,这几个设置代码如下:
这些代码全是PHPExcel类里面提供的,所以,这里不必多解释。
2) 开发填入数据代码:
为了传授方式,我们将直接以这种形式去填入数据:https://www.bnxb.com/excelinsert.php?dopost=exdata&typeid=6&n=test1
表示通过文件excelinert.php插入excel里面的名称为test1的里面的数据,把这些数据填入到织梦数据库表dede_archvies里面,栏目id为6的表,其中,dopost=exdata表示填入数据口令,因为,并作一个推论的话,那什么人也能够插入至您的数据库表里面数据了,这就是非常可怕的,就像是一个网站没后台一样,这是不是非常可能将谁都可以步入网站后台里面,同样的,如果不加这个口令的话,谁都可以填入数据,这就是不安全的。
所以,在填入数据前先通过$GET超级数组以获取到typeid、do和n的值,然后,进行对照看一看有没有权限展开填入数据库操作方式,第一个判断应是判断口令与否恰当,如果这个都不恰当的话,就不再向上操作方式了。
为了讲解便利,下面提供excelinsert.php研发完整的代码:
header("Content-type:text/html;charset=utf8"); require_once('/../dedecms/include/common.inc.php'); error_reporting(E_ALL); set_time_limit(0); date_default_timezone_set('Europe/London'); set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/'); include 'PHPExcel/IOFactory.php'; if(!empty($_GET)){ $typeid = $_GET['typeid']; $dopost = $_GET['do']; if($dopost == "exdata"){ if(!empty($_GET['n'])){ $inputFileName = './'.$_GET['n'].'.xlsx'; $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); $rowarr=array(); $dsql->Execute('all',"select bio2,bio1 from `dede_addonshop`"); while ($rowall = $dsql->GetArray('all')) { $rowarr[]=$rowall; } foreach ($sheetData as $v) { foreach ($rowarr as $vt) { if(in_array($v['B'],$vt)&&$v['A']==$vt['bio1']){ echo "货号为:".$v['B']." 厂商为:".$v['A']."的数据已在表中,请在excel文件里面删除这一条后再添加!"; } } } $row = $dsql->GetOne("select aid,bio2 from `dede_addonshop` order by aid desc"); if(!empty($row)){ $aid = $row['aid']; $bio2 = $row['bio2']; }else{ $aid = 0; $bio2 = ''; } if($bio2==$sheetData[count($sheetData)]['B']){ ShowMsg("无法重复添加内容",'javascript:;'); exit; } $arcrow = $dsql->GetOne("select id from `dede_archives` order by id desc"); if(!empty($arcrow)){ $arcid = $arcrow['id']; }else{ $arcid = 0; } $tinyrow = $dsql->GetOne("select id from `dede_arctiny` order by id desc"); if(!empty($tinyrow)){ $tinyid = $tinyrow['id']; }else{ $tinyid = 0; } $id = max($aid,$arcid,$tinyid); $alphalpha = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'); $fieldnum = count($sheetData[1]); $fields = $fieldvalue = ''; for ($i=0; $i < $fieldnum; $i++) { $fields .= $sheetData[1][$alphalpha[$i]]. ','; } $fields = substr($fields, 0,-1); foreach ($sheetData as $value) { $pubdate = GetMkTime(GetDateTimeMk(time())); $click = mt_rand(50, 200); if($value['A']=='bio1'|$value['A']=='厂商'){ continue; } $id = $id+1; //以获取字段值$value['A']; for ($i=0; $i < $fieldnum; $i++) { $fieldvalue .= " ,'".$value[$alphalpha[$i]]."' "; } $C = trim($value['C']); $senddate = time(); $arcquery = "INSERT INTO `dede_archives`(id,typeid,title,mid,channel,pubdate,senddate,click,ismake)VALUES ('$id','$typeid','$C','1','6','$pubdate','$senddate','$click','-1');"; $dsql->ExecuteNoneQuery($arcquery); $query = "INSERT INTO `dede_addonshop`(aid,typeid,$fields) VALUES ('$id','$typeid'{$fieldvalue});"; $dsql->ExecuteNoneQuery($query); $fieldvalue = ''; $tinyquery = "INSERT INTO `dede_arctiny`(id,typeid,channel,mid,senddate)VALUES ('$id','$typeid','6','1','$senddate');"; $dsql->ExecuteNoneQuery($tinyquery); } $num = count($sheetData)-2; ShowMsg("生日快乐,成功填入 ".$num." 条数据!",'javascript:;'); }