欢迎来到六久阁织梦模板网!
批量导入excel数据到织梦网站教程

批量导入excel数据到织梦网站教程

浏览次数: 0

作者: 六久阁织梦模板网

信息来源: 六久阁

更新日期: 2018-03-31

文章简介

有时候我们需要把一些 excel 的数据批量导入到织梦网站里面,例如,一些查询数据的网站里面的数据是一次性导入的,这样用户可以查询使用,而不是从网站后台一条一条的加数据。 本教程将以把 excel 数据导入到织梦系统( dedecms) 为例子进行批量数据导入的开

  • 正文开始
  • 热门文章

有时候我们需要把一些excel的数据批量导入到织梦网站里面,例如,一些查询数据的网站里面的数据是一次性导入的,这样用户可以查询使用,而不是从网站后台一条一条的加数据。

 

本教程将以把excel数据导入到织梦系统(dedecms)为例子进行批量数据导入的开发,假设把excel数据导入到织梦主表dede_archives(还有微表和附加表,这里就用主表代表这三个表)里面。

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

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

excel读取数据程序开发

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

  下载地址:https://github.com/PHPOffice/PHPExcel

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

  现在我们已经把第一部分开发好了(其实,是借助人家开发的php类)。

把读取出来的数据插入到主表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类文件

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

 

 2) 开发插入数据代码:

  为了讲解方式,我们将直接以这种形式来插入数据:http://www.lol9.cn/excelinsert.php?dopost=exdata&typeid=6&n=test1

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

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

  为了讲解方便,下面提供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))条件成立时,才有可能进入插入操作。

  然后,获取typeiddo的值:

    $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,例如,当前表中最大的id9,那么,下面我们在插入数据时对应的id值就是从10开始,这是非常重要的,如果不做这个判断,那么,就会把原来的数据给覆盖掉。

 

 4)遍历数组$sheetData插入数据

  因为,通过PHPExcel获取到的数据是保存在$sheetData二维数据里面,类似array(array('a','b'),array('b','c')),所以,在遍历这个数组,然后,把这个数组里面的数据插入到织梦的主表、微表和附加表里面。

  这里要注意$id = $id+1,这行代码为什么要做这行代码,是因为,如果没有这行代码那么,在插入数据时id的值一直是同一个,例如,$id=9,这样一直是9,这是不可能的,因为,一个网站面的每一篇文章的id都是不同的,如果全一样的话,可能网站里面显示数据就只有一条了,其它的全部被覆盖掉了。


织梦二次开发QQ群

本站客服QQ号:3149518909(点击左边QQ号交流),群号(383578617) DedeCMS织梦教程QQ群 如果您有任何织梦问题,请把问题发到群里,阁主将为您写解决教程!

转载请注明: 织梦模板 » 批量导入excel数据到织梦网站教程

  • 织梦dedecms手机站m目录下不生成index.html实现动态更新
    阅读
    用 织梦建站 会手机站首页不更新的苦恼,每次 PC 更新,要去删除 m 目录下的 index.html ,手机站首页才会更新,这样很麻烦,通过以下修改,让手机站首页是动态的,不生成 index.html , PC 端更新后,手机端首页自动更新。 把 \m\index.php 里面的 $row[sho...
  • 织梦Fatal error: Call to undefined function make_hash() in /dede/sys_info.php on line 201的解决方法
    阅读
    织梦系统安装好后,进入后台,出现Fatal error: Call to undefined function make_hash() in /dede/sys_info.php on line 201 一般出现这个问题是因为升级网站引起的。我们可以直接把错误提示这段代码删除或者屏蔽就行了。 打开/dede/sys_info.php,找到201...
  • 织梦dedecms提交自定义表单后发送到指定邮箱
    阅读
    网上很多教程都是用 dedecms 自带的邮件库发送邮件,而且是写死要发送的字段内容,今天我们用 phpmailer 来给站长发送自定义表单提交的数据到指定邮箱上 (QQ 邮箱, 163 邮箱都可以 ) ,不写死任何东西,有什么字段就提交发送什么字段。 操作之前,我们要先...
  • 织梦dedecms网站添加打赏功能
    阅读
    有时我们看到别人家的织梦dedecms网站有打赏功能,是不是羡慕嫉妒恨呢?今天我来给大家讲讲织梦网站怎么添加支付宝、微信打赏功能。 二、首先登陆畅言后台(没有畅言账号的首先注册账号) 三、进入后台,找到实验室--打赏 四、设置配置信息,保存。 五、复制...
  • 织梦Dedecms 5.7 火车头采集免登陆发布接口适配PHP7.X插件
    阅读
    最近有粉丝说,之前用的火车头发布文章时,用免登陆接口在PHP7.0环境中显示空白,于是今天抽空更新了一下插件(话说,DedeCms早期版本无法在PHP7.X运行,用最新版的!),那么接下来的代码就是插件发布模块无须变更,只需要变更接口插件就可以了 ?php/*/////...
  • 织梦dedecms系统多城市分站功能开发思路
    阅读
    当前很多人用织梦dedecms系统建站,多城市分站对地方性长尾关键词和全国市场的推广有着很大的帮助,今天和大家分享下如何实现织梦dedecms系统多城市分站功能。 方法/步骤 织梦dede城市分站有三种方法: 第一种是建立N多个模板,有多少个城市建立多少个模板,...
  • 织梦手机站下一篇变上一篇而且还出错Request Error!
    阅读
    最新的织梦dedecms程序手机版下一篇变上一篇而且还出错Request Error!,这是因为官方写错了一个地方 打开 /include/arc.archives.class.php 找到 $mlink = view.php?aid=.$preRow[id]; 注意:这个文件里面有2个上面的代码,真正要改的是大概在 839 行 改成 $...
  • 织梦获取当前栏目id并判断使当前导航栏目高亮
    阅读
    织梦导航栏目高亮代码如下: {dede:field name=typeid runphp=yes} if(@me==8) @me=1; else @me=0; {/dede:field} 导航的写法, 比如:lia href={dede:type typeid=7}[field:typelink /]{/dede:type} {dede:field name=typeid runphp=yes} if(@me==7) @me=cl...
  • 织梦小说站上一章节下一章节修改arc.archives.class.php的实现方法
    阅读
    织梦小说站上一章节下一章节实现方法,通过修改include/arc.archives.class.php这个文件来实现这样的效果: 实现原理:通过writer作者栏来匹配所有章节,然后根据文章ID排序来实现织梦小说文章上一章节下一章节。 部分代码截图: 附:arc.archives.class.php...
  • 织梦火车头采集免登陆接口采集文章后自动更新栏目、首页、文章页,实现自动化采集
    阅读
    最近用织梦dedecms程序采集文章时候,发现每次采集都要去后台更新一下文章、栏目、上下篇以及首页,操作起来真心麻烦,后面在网上收集了一些代码以及经过自己调试,发现居然可以自动更新文章页以及栏目、首页。真心爽,这样子就能稳稳的挂机采集了哈。这是免...
收藏此文 打赏本站

如本文对您有帮助,就请六久阁织梦模板网抽根烟吧!

  • 支付宝打赏
    支付宝扫描打赏
    微信打赏
    微信扫描打赏
织梦arclist调用嵌套tag标签教程
« 上一篇 2018年03月31日
织梦网站如何用jQuery.lazyload延时加载图片
下一篇 » 2018年03月30日

精彩评论

有问题在这里提问,阁主会为你解决!
  • 全部评论(0
    还没有评论,快来抢沙发吧!
推荐织梦插件更多
更新时间:2019-01-01

人已经看过了!

更新时间:2019-11-29

人已经看过了!

更新时间:2019-10-30

人已经看过了!

更新时间:2019-05-28

人已经看过了!

更新时间:2017-07-07

人已经看过了!

更新时间:2017-07-13

人已经看过了!

更新时间:2019-06-09

人已经看过了!

推荐精品模板更多
营销型家电厨具用品织梦模板(带手机端)
更新时间:2019-11-09

人已经看过了!

高端大气装修装饰公司营销官网(带手机端带筛选)
更新时间:2017-11-01

人已经看过了!

淘宝客优惠券带手机端 自动采集自动更新
更新时间:2017-10-19

人已经看过了!

仿魔酷阁织梦整站下载
更新时间:2017-08-19

人已经看过了!

绿色园林景观设计企业响应式织梦模板
更新时间:2019-11-07

人已经看过了!

律师事务所网站织梦dede模板(中英双语自适应模板)
更新时间:2019-11-07

人已经看过了!

工程建筑职业学校类织梦模板(带手机端)
更新时间:2018-04-24

人已经看过了!