于一些企业网站或者淘宝客类网站经常会需要将一些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文件,这个文件是最重要的,本功能就是通过这个文件来处理的,这几个设置代码如下:
DEDECMS批量导入excel数据到后台文章系统的开发教程插图

这些代码全是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(\'/http://blog.aftss.cn/a/zhimengjiaocheng/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 . \'http://blog.aftss.cn/Classes/\');

include \'PHPExcel/IOFactory.php\';

if(!empty($_GET)){

$typeid=$_GET[\'typeid\'];

$dopost=$_GET[\'do\'];

if($dopost==\"exdata\"){

if(!empty($_GET[\'n\'])){

$inputFileName=\'http://blog.aftss.cn/a/zhimengjiaocheng/development/\'.$_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文件里面删除这一条后再添加!\";

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:;\');

}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注