织梦dedecms批量导入excel数据到后台文章系统的方法教程

时间:2021-11-24
类别:教程 - CMS教程

对于一些企业网站或者淘宝客类网站经常会需要将一些excel的数据批量导入到网站,通过批量导入来节省时间而不是从网站后台一条一条的录入加数据。本教程就是以把excel数据导入到织梦系统(dedecms)为例子进行批量数据导入的开发,假设把excel数据导入到织梦主表dede_archives(还有微表和附加表,这里就用主表代表这三个表)里面。

批量导入excel数据原理:通过查询excel,把数据一条一条的读取出来,然后,通过我们开发的php程序把数据导入到表里面。

通过上面的原理我们知道,我们可以把批量导入excel数据分为两部分,一部分是开发出从excel读取数据的程序,另一部分是开发出把读取出来的数据插入到数据库表dede_archives里面。

从excel读取数据程序开发

其实,这一步有一个老外已经帮我们开发好了,这个老外开发了一套专门读取excel数据表的程序叫PHPExcel类库。

这个excel类库还包括其它的一些功能,这里不一一介绍,您可以下载来看看,这里只对读取excel进行讲解。

把读取出来的数据插入到主表dede_archives里面

当通过PHPExcel类库里面提供的类读取数据后,这一步就是把数据插入到数据库表里面,所以,这一个教程的开发其实就是在开发这一部分 ; 把从excel读取出来的数据插入到主表中的程序开发。

为了讲解方便,我们把插入数据库表中的数据的文件名叫做excelinert.php ,下面就在这个文件里面进入程序开发,把读取出来的数据插入到数据库表中。

插入数据开发原理

一、开发前的准备:

在excelinsert.php里面加入一个header头的编码,目的是为了统一编码以免出现乱码:header("Content-type:text/html;charset=utf8");

引入织梦系统的公共文件common.inc.php,为什么要引入这个文件,我们在插入数据库表前,首页要连接网站的数据库,如果不连接将无法插入数据库数据。要注意,引入文件的路径要改成您自己的,因为,我把织梦系统安装在了dedecms里面,所以,路径中有这个目录名称dedecms,如果您安装在根目录的话就去掉这个路径。

设置错误报告、设置时区、设置程序运行时间,当然,这个运行时间可以不设置、设置PHPExcel类的类库存路径,然后,引入IOFactory.php文件,这个文件是最重要的,本功能就是通过这个文件来处理的,这几个设置代码如下:

织梦dedecms批量导入excel数据到后台文章系统的方法教程

这些代码全是PHPExcel类里面提供的,所以,这里不用多解释。

二、 开发插入数据代码:

为了讲解方式,我们将直接以这种形式来插入数据:https://网站域名/excelinsert.php?dopost=exdata&typeid=6&n=test1

表示通过文件excelinert.php插入excel里面的名称为test1的里面的数据,把这些数据插入到织梦数据库表dede_archvies里面,栏目id为6的表中,其中,dopost=exdata表示插入数据口令,因为,作一个判断的话,那什么人也能插入到您的数据库表里面数据了,这是非常可怕的,就像一个网站没有后台一样,这是不是非常可能谁都可以进入网站后台里面,同样的,如果不加这个口令的话,谁都可以插入数据,这是不安全的。

所以,在插入数据前先通过$GET超级数组获取到typeid、do和n的值,然后,进行对比看看有没有权限进行插入数据库操作,第一个判断应当是判断口令是否正确,如果这个都不正确的话,就不再向下操作了。

为了讲解方便,下面提供excelinsert.php开发完整的代码:

  1. header("Content-type:text/html;charset=utf8"); 
  2.  
  3. require_once('/../dedecms/include/common.inc.php'); 
  4.  
  5. error_reporting(E_ALL); 
  6.  
  7. set_time_limit(0); 
  8.  
  9. date_default_timezone_set('Europe/London'); 
  10.  
  11. /** Include path **/ 
  12.  
  13. set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/'); 
  14.  
  15. /** PHPExcel_IOFactory */ 
  16.  
  17. include 'PHPExcel/IOFactory.php'; 
  18.  
  19. if(!emptyempty($_GET)){ 
  20.  
  21. $typeid = $_GET['typeid']; 
  22.  
  23. $dopost = $_GET['do']; 
  24.  
  25. if($dopost == "exdata"){ 
  26.  
  27. if(!emptyempty($_GET['n'])){ 
  28.  
  29. $inputFileName = './'.$_GET['n'].'.xlsx'; 
  30.  
  31. $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); 
  32.  
  33. $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); 
  34.  
  35. $rowarr=array(); 
  36.  
  37. $dsql->Execute('all',"select bio2,bio1 from `dede_addonshop`"); 
  38.  
  39. while ($rowall = $dsql->GetArray('all')) { 
  40.  
  41. $rowarr[]=$rowall
  42.  
  43.  
  44. foreach ($sheetData as $v) { 
  45.  
  46. foreach ($rowarr as $vt) { 
  47.  
  48. if(in_array($v['B'],$vt)&&$v['A']==$vt['bio1']){ 
  49.  
  50. echo "货号为:".$v['B']." 
  51. 厂商为:".$v['A']." 
  52. 的数据已在表中,请在excel文件里面删除这一条后再添加!"; 
  53.  
  54. exit
  55.  
  56.  
  57. //附加表插入数据前处理 
  58.  
  59. $row = $dsql->GetOne("select aid,bio2 from `dede_addonshop` order by aid desc"); 
  60.  
  61. if(!emptyempty($row)){ 
  62.  
  63. $aid = $row['aid']; 
  64.  
  65. $bio2 = $row['bio2']; 
  66.  
  67. }else
  68.  
  69. $aid = 0; 
  70.  
  71. $bio2 = ''; 
  72.  
  73.  
  74. //处理重复问题 
  75.  
  76. if($bio2==$sheetData[count($sheetData)]['B']){ 
  77.  
  78. ShowMsg("不能重复添加内容",'javascript:;'); 
  79.  
  80. exit
  81.  
  82.  
  83. //主表插入数据前处理 
  84.  
  85. $arcrow = $dsql->GetOne("select id from `dede_archives` order by id desc"); 
  86.  
  87. if(!emptyempty($arcrow)){ 
  88.  
  89. $arcid = $arcrow['id']; 
  90.  
  91. }else
  92.  
  93. $arcid = 0; 
  94.  
  95.  
  96. //微表插入数据前处理 
  97.  
  98. $tinyrow = $dsql->GetOne("select id from `dede_arctiny` order by id desc"); 
  99.  
  100. if(!emptyempty($tinyrow)){ 
  101.  
  102. $tinyid = $tinyrow['id']; 
  103.  
  104. }else
  105.  
  106. $tinyid = 0; 
  107.  
  108.  
  109. //找出最大的id 
  110.  
  111. $id = max($aid,$arcid,$tinyid); 
  112.  
  113. $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'); 
  114.  
  115. //字段数量 
  116.  
  117. $fieldnum = count($sheetData[1]); 
  118.  
  119. $fields = $fieldvalue = ''; 
  120.  
  121. for ($i=0; $i < $fieldnum$i++) { 
  122.  
  123. $fields .= $sheetData[1][$alphalpha[$i]]. ','; 
  124.  
  125.  
  126. $fields = substr($fields, 0,-1); 
  127.  
  128. //遍历数组 
  129.  
  130. foreach ($sheetData as $value) { 
  131.  
  132. $pubdate = GetMkTime(GetDateTimeMk(time())); 
  133.  
  134. $click = mt_rand(50, 200); 
  135.  
  136. if($value['A']=='bio1'|$value['A']=='厂商'){ 
  137.  
  138. continue
  139.  
  140.  
  141. $id = $id+1; 
  142.  
  143. //获取字段值$value['A']; 
  144.  
  145. for ($i=0; $i < $fieldnum$i++) { 
  146.  
  147. $fieldvalue .= " ,'".$value[$alphalpha[$i]]."' "; 
  148.  
  149.  
  150. //标题 
  151.  
  152. $C = trim($value['C']); 
  153.  
  154. //保存到主表 
  155.  
  156. $senddate = time(); 
  157.  
  158. $arcquery = "INSERT INTO `dede_archives`(id,typeid,title,mid,channel,pubdate,senddate,click,ismake)VALUES ('$id','$typeid','$C','1','6','$pubdate','$senddate','$click','-1');"; 
  159.  
  160. $dsql->ExecuteNoneQuery($arcquery); 
  161.  
  162. //保存到附近加表 
  163.  
  164. $query = "INSERT INTO `dede_addonshop`(aid,typeid,$fields
  165.  
  166. VALUES ('$id','$typeid'{$fieldvalue});"; 
  167.  
  168. $dsql->ExecuteNoneQuery($query); 
  169.  
  170. $fieldvalue = ''; 
  171.  
  172. //保存到微表 
  173.  
  174. $tinyquery = "INSERT INTO `dede_arctiny`(id,typeid,channel,mid,senddate)VALUES ('$id','$typeid','6','1','$senddate');"; 
  175.  
  176. $dsql->ExecuteNoneQuery($tinyquery); 
  177.  
  178.  
  179. $num = count($sheetData)-2; 
  180.  
  181. ShowMsg("恭喜,成功插入   ".$num."   条数据!",'javascript:;'); 
  182.  
    收藏