DEDE怎麼批次匯入excel資料到後台?
DEDE批量導入excel資料到後台文章系統的開發教學
對於一些企業網站或淘寶客類網站經常會需要將一些excel的數據批量導入到網站,透過批量導入來節省時間而不是從網站後台一條一條的錄入加數據,具有一定的參考價值,感興趣的小伙伴們可以參考一下
推薦學習:織夢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 ,下面就在這個檔案裡面進入程式開發,把讀取出來的資料插入資料庫表中。
插入資料開發原理
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都是不同的,如果全一样的话,可能网站里面显示数据就只有一条了,其它的全部被覆盖掉了。
以上是DEDE怎麼批次匯入excel資料到後台的詳細內容。更多資訊請關注PHP中文網其他相關文章!