对于一些企业网站或者淘宝客类网站经常会必要将一些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) 开辟插入数据代码:
表现通过文件excelinert.php插入excel里面的名称为test1的里面的数据,把这些数据插入到织梦数据库表dede_archvies里面,栏目id为6的表中,此中,dopost=exdata表现插入数据口令,因为,作一个判断的话,那什么人也能插入到您的数据库表里面数据了,这黑白常可怕的,就像一个网站没有配景一样,这是不黑白常大概谁都可以进入网站配景里面,同样的,如果不加这个口令的话,谁都可以插入数据,这是不安全的。
以是,在插入数据前先通过$GET超等数组获取到typeid、do和n的值,然后,举行对比看看有没有权限举行插入数据库操作,第一个判断应当是判断口令是否正确,如果这个都不正确的话,就不再向下操作了。
为了讲解方便,下面提供excelinsert.php开辟完备的代码:
- <?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');
- /** Include path **/
- set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
- /** PHPExcel_IOFactory */
- 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']."<br>厂商为:".$v['A']."<br>的数据已在表中,请在excel文件里面删除这一条后再添加!";
- exit;
- }
- }
- }
- //附加表插入数据前处理
- $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
- $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:;');
- }
- }
- }else{
- echo "密码或文件名错误!您无权做任何操作!";
- }
- ?>
复制代码
以上就是完备的把excel里面数据插入到数据库主表dede_archives里面的代码,是颠末实际测试的完全没有题目,如果你做出来不行的话,大概是您引入的common.inc.php路径和引入的PHPExcel类库Classess类有题目,若有题目请检查这两个地方。
代码分析
1)第一步先判断问号后面是不是为空,即dopost=exdata&typeid=6&n=test1字符串是否为空,如果这个字符串都是空的话,其它,就不消操作了,直接通过出程序,表现:echo "暗码或文件名错误!您无权做任何操作!";
只有当if(!empty($_GET))条件建立时,才有大概进入插入操作。
然后,获取typeid和do的值:- $typeid = $_GET['typeid'];
- $dopost = $_GET['do'];
复制代码
因为下面要对要插入到数据库表中数据时还要举行口令的判断,以是,这里获取do的值是必须的,但是,这里为什么一起要获取栏目id的值呢?因为,这里根本上要到末了一步才使用,为什么不比及使用时再获取呢?如果暗码不对或其它原因的话,不能举行插入操作,那不是白白获取了$typeid的值,从代码优化的角度,如许不是最优的,但是,大家请留意,因为,下面要对获取到的$GET的数组举行操作,以是,为了保险起见,这时大这个地方先获取到栏目id的值,如许可以保证不会在后面堕落,当然,如果您在开辟时,能保证不会堕落可以在使用$typeid时再获取也可以。
然后,判断口令是否正确,即if($dopost=="exdata")是否为真,若为真说明我们在浏览器地点栏输入的口令就是正确的,否则,就是错误的,如果堕落出退出程序不做任何操作。
如果正确,则获取n的值,文件excel的文件名$inputFileName。
然后,通过PHPExcel类获取到excel文件里面的数据生存到数组$sheetData里面。
2)判断要插入的数据是否已经存在于表dede_addonshop里面。
查询附加表dede_addonshop里面的字段bio2,bio1,并把查询出来的一维数组放到二维数组$rowall里面。
因为,把一条数据插入到织梦体系里面后,实在,是在织梦的主表、附加表和微表进入了插入操作,以是,在插入前都要先判断一下插入的数据是不是在这三个表中都已经存在了,如果已经存在了就不要进入插入操作了。
3)插入数据库表时最大数据id的判断
当向主表或附加表或微表加插入数据库前,还要判断一下这时主表或附加表或微表里面最大的id,把这个id查询出来,进入对比即:$id = max($aid,$arcid,$tinyid);
如许对比以后获取到的$id的值就是最大的,获取这个最大的$id后,就可以在这个$id的根本上增长$id,例如,当前表中最大的id为9,那么,下面我们在插入数据时对应的id值就是从10开始,这黑白常紧张的,如果不做这个判断,那么,就会把原来的数据给覆盖掉。
3)遍历数组$sheetData插入数据
因为,通过PHPExcel获取到的数据是生存在$sheetData二维数据里面,雷同array(array('a','b'),array('b','c')),以是,在遍历这个数组,然后,把这个数组里面的数据插入到织梦的主表、微表和附加表里面。
这里要留意$id = $id+1,这行代码为什么要做这行代码,是因为,如果没有这行代码那么,在插入数据时id的值一直是同一个,例如,$id=9,如许一直是9,这是不大概的,因为,一个网站面的每一篇文章的id都是差别的,如果全一样的话,大概网站里面表现数据就只有一条了,其它的全部被覆盖掉了。
以上就是本文的全部内容,希望对大家的学习有所资助,也希望大家多多支持脚本之家。 |