2024年04月18日 dedecms 批量 导入 excel 数据 后台 文章 懒猪技术
对于一些企业网站或者淘宝客类网站经常会需要将一些excel的数据批量导入到网站,通过批量导入来节省时间而不是从网站后台一条一条的录入加数据。本教程就是以把excel数据导入到织梦系统(dedecms)为例子进行批量数据导入的开发,假设把excel数据导入到织梦主表dede_archives(还有微表和附加表,这里就用主表代表这三个表)里面。
批量导入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开发完整的代码:
| 001 | header("Content-type:text/html;charset=utf8"); |
| 002 |
| 003 | require_once('/../dedecms/include/common.inc.php'); |
| 004 |
| 005 | error_reporting(E_ALL); |
| 006 |
| 007 | set_time_limit(0); |
| 008 |
| 009 | date_default_timezone_set('Europe/London'); |
| 010 |
| 011 |
| 012 |
| 013 | set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/'); |
| 014 |
| 015 |
| 016 |
| 017 | include 'PHPExcel/IOFactory.php'; |
| 018 |
| 019 | if(!empty($_GET)){ |
| 020 |
| 021 | $typeid = $_GET['typeid']; |
| 022 |
| 023 | $dopost = $_GET['do']; |
| 024 |
| 025 | if($dopost == "exdata"){ |
| 026 |
| 027 | if(!empty($_GET['n'])){ |
| 028 |
| 029 | $inputFileName = './'.$_GET['n'].'.xlsx'; |
| 030 |
| 031 | $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); |
| 032 |
| 033 | $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); |
| 034 |
| 035 | $rowarr=array(); |
| 036 |
| 037 | $dsql->Execute('all',"select bio2,bio1 from `dede_addonshop`"); |
| 038 |
| 039 | while ($rowall = $dsql->GetArray('all')) { |
| 040 |
| 041 | $rowarr[]=$rowall; |
| 042 |
| 043 | } |
| 044 |
| 045 | foreach ($sheetData as $v) { |
| 046 |
| 047 | foreach ($rowarr as $vt) { |
| 048 |
| 049 | if(in_array($v['B'],$vt)&&$v['A']==$vt['bio1']){ |
| 050 |
| 051 | echo "货号为:".$v['B']." |
| 052 | 厂商为:".$v['A']." |
| 053 | 的数据已在表中,请在excel文件里面删除这一条后再添加!"; |
| 054 |
| 055 | exit; |
| 056 | } |
| 057 |
| 058 | } |
| 059 | } |
| 060 |
| 061 | //附加表插入数据前处理 |
| 062 |
| 063 | $row = $dsql->GetOne("select aid,bio2 from `dede_addonshop` order by aid desc"); |
| 064 |
| 065 | if(!empty($row)){ |
| 066 |
| 067 | $aid = $row['aid']; |
| 068 |
| 069 | $bio2 = $row['bio2']; |
| 070 |
| 071 | }else{ |
| 072 |
| 073 | $aid = 0; |
| 074 |
| 075 | $bio2 = ''; |
| 076 |
| 077 | } |
| 078 |
| 079 | //处理重复问题 |
| 080 |
| 081 | if($bio2==$sheetData[count($sheetData)]['B']){ |
| 082 |
| 083 | ShowMsg("不能重复添加内容",'javascript:;'); |
| 084 |
| 085 | exit; |
| 086 |
| 087 | } |
| 088 |
| 089 | //主表插入数据前处理 |
| 090 |
| 091 | $arcrow = $dsql->GetOne("select id from `dede_archives` order by id desc"); |
| 092 |
| 093 | if(!empty($arcrow)){ |
| 094 |
| 095 | $arcid = $arcrow['id']; |
| 096 |
| 097 | }else{ |
| 098 |
| 099 | $arcid = 0; |
| 100 |
| 101 | } |
| 102 |
| 103 | //微表插入数据前处理 |
| 104 |
| 105 | $tinyrow = $dsql->GetOne("select id from `dede_arctiny` order by id desc"); |
| 106 |
| 107 | if(!empty($tinyrow)){ |
| 108 |
| 109 | $tinyid = $tinyrow['id']; |
| 110 |
| 111 | }else{ |
| 112 |
| 113 | $tinyid = 0; |
| 114 |
| 115 | } |
| 116 |
| 117 | //找出最大的id |
| 118 |
| 119 | $id = max($aid,$arcid,$tinyid); |
| 120 |
| 121 | $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'); |
| 122 |
| 123 | //字段数量 |
| 124 |
| 125 | $fieldnum = count($sheetData[1]); |
| 126 |
| 127 | $fields = $fieldvalue = ''; |
| 128 |
| 129 | for ($i=0; $i < $fieldnum; $i++) { |
| 130 |
| 131 | $fields .= $sheetData[1][$alphalpha[$i]]. ','; |
| 132 |
| 133 | } |
| 134 |
| 135 | $fields = substr($fields, 0,-1); |
| 136 |
| 137 | //遍历数组 |
| 138 |
| 139 | foreach ($sheetData as $value) { |
| 140 |
| 141 | $pubdate = GetMkTime(GetDateTimeMk(time())); |
| 142 |
| 143 | $click = mt_rand(50, 200); |
| 144 |
| 145 | if($value['A']=='bio1'|$value['A']=='厂商'){ |
| 146 |
| 147 | continue; |
| 148 |
| 149 | } |
| 150 |
| 151 | $id = $id+1; |
| 152 |
| 153 | //获取字段值$value['A']; |
| 154 |
| 155 | for ($i=0; $i < $fieldnum; $i++) { |
| 156 |
| 157 | $fieldvalue .= " ,'".$value[$alphalpha[$i]]."' "; |
| 158 |
| 159 | } |
| 160 |
| 161 | //标题 |
| 162 |
| 163 | $C = trim($value['C']); |
| 164 |
| 165 | //保存到主表 |
| 166 |
| 167 | $senddate = time(); |
| 168 |
| 169 | $arcquery = "INSERT INTO `dede_archives`(id,typeid,title,mid,channel,pubdate,senddate,click,ismake)VALUES ('$id','$typeid','$C','1','6','$pubdate','$senddate','$click','-1');"; |
| 170 |
| 171 | $dsql->ExecuteNoneQuery($arcquery); |
| 172 |
| 173 | //保存到附近加表 |
| 174 |
| 175 | $query = "INSERT INTO `dede_addonshop`(aid,typeid,$fields) |
| 176 |
| 177 | VALUES ('$id','$typeid'{$fieldvalue});"; |
| 178 |
| 179 | $dsql->ExecuteNoneQuery($query); |
| 180 |
| 181 | $fieldvalue = ''; |
| 182 |
| 183 | //保存到微表 |
| 184 |
| 185 | $tinyquery = "INSERT INTO `dede_arctiny`(id,typeid,channel,mid,senddate)VALUES ('$id','$typeid','6','1','$senddate');"; |
| 186 |
| 187 | $dsql->ExecuteNoneQuery($tinyquery); |
| 188 |
| 189 | } |
| 190 |
| 191 | $num = count($sheetData)-2; |
| 192 |
| 193 | ShowMsg("恭喜,成功插入 ".$num." 条数据!",'javascript:;'); |
| 194 |
| 195 | } |
本文链接:http://so.lmcjl.com/news/2534/