DEDE批量導(dǎo)入excel數(shù)據(jù)到后臺文章系統(tǒng)的開發(fā)教程
對于一些企業(yè)網(wǎng)站或者淘寶客類網(wǎng)站經(jīng)常會需要將一些excel的數(shù)據(jù)批量導(dǎo)入到網(wǎng)站,通過批量導(dǎo)入來節(jié)省時間而不是從網(wǎng)站后臺一條一條的錄入加數(shù)據(jù)。本教程就是以把excel數(shù)據(jù)導(dǎo)入到織夢系統(tǒng)(dedecms)為例子進行批量數(shù)據(jù)導(dǎo)入的開發(fā),假設(shè)把excel數(shù)據(jù)導(dǎo)入到織夢主表dede_archives(還有微表和附加表,這里就用主表代表這三個表)里面。
批量導(dǎo)入excel數(shù)據(jù)原理:通過查詢excel,把數(shù)據(jù)一條一條的讀取出來,然后,通過我們開發(fā)的php程序把數(shù)據(jù)導(dǎo)入到表里面。
通過上面的原理我們知道,我們可以把批量導(dǎo)入excel數(shù)據(jù)分為兩部分,一部分是開發(fā)出從excel讀取數(shù)據(jù)的程序,另一部分是開發(fā)出把讀取出來的數(shù)據(jù)插入到數(shù)據(jù)庫表dede_archives里面。
從excel讀取數(shù)據(jù)程序開發(fā)
其實,這一步有一個老外已經(jīng)幫我們開發(fā)好了,這個老外開發(fā)了一套專門讀取excel數(shù)據(jù)表的程序叫PHPExcel類庫。
這個excel類庫還包括其它的一些功能,這里不一一介紹,您可以下載來看看,這里只對讀取excel進行講解。
把讀取出來的數(shù)據(jù)插入到主表dede_archives里面
當(dāng)通過PHPExcel類庫里面提供的類讀取數(shù)據(jù)后,這一步就是把數(shù)據(jù)插入到數(shù)據(jù)庫表里面,所以,這一個教程的開發(fā)其實就是在開發(fā)這一部分 ; 把從excel讀取出來的數(shù)據(jù)插入到主表中的程序開發(fā)。
為了講解方便,我們把插入數(shù)據(jù)庫表中的數(shù)據(jù)的文件名叫做excelinert.php ,下面就在這個文件里面進入程序開發(fā),把讀取出來的數(shù)據(jù)插入到數(shù)據(jù)庫表中。
插入數(shù)據(jù)開發(fā)原理
1)開發(fā)前的準(zhǔn)備:
在excelinsert.php里面加入一個header頭的編碼,目的是為了統(tǒng)一編碼以免出現(xiàn)亂碼:header("Content-type:text/html;charset=utf8");
引入織夢系統(tǒng)的公共文件common.inc.php,為什么要引入這個文件,我們在插入數(shù)據(jù)庫表前,首頁要連接網(wǎng)站的數(shù)據(jù)庫,如果不連接將無法插入數(shù)據(jù)庫數(shù)據(jù)。要注意,引入文件的路徑要改成您自己的,因為,我把織夢系統(tǒng)安裝在了dedecms里面,所以,路徑中有這個目錄名稱dedecms,如果您安裝在根目錄的話就去掉這個路徑。
設(shè)置錯誤報告、設(shè)置時區(qū)、設(shè)置程序運行時間,當(dāng)然,這個運行時間可以不設(shè)置、設(shè)置PHPExcel類的類庫存路徑,然后,引入IOFactory.php文件,這個文件是最重要的,本功能就是通過這個文件來處理的,這幾個設(shè)置代碼如下:

這些代碼全是PHPExcel類里面提供的,所以,這里不用多解釋。
2) 開發(fā)插入數(shù)據(jù)代碼:
表示通過文件excelinert.php插入excel里面的名稱為test1的里面的數(shù)據(jù),把這些數(shù)據(jù)插入到織夢數(shù)據(jù)庫表dede_archvies里面,欄目id為6的表中,其中,dopost=exdata表示插入數(shù)據(jù)口令,因為,作一個判斷的話,那什么人也能插入到您的數(shù)據(jù)庫表里面數(shù)據(jù)了,這是非??膳碌?,就像一個網(wǎng)站沒有后臺一樣,這是不是非??赡苷l都可以進入網(wǎng)站后臺里面,同樣的,如果不加這個口令的話,誰都可以插入數(shù)據(jù),這是不安全的。
所以,在插入數(shù)據(jù)前先通過$GET超級數(shù)組獲取到typeid、do和n的值,然后,進行對比看看有沒有權(quán)限進行插入數(shù)據(jù)庫操作,第一個判斷應(yīng)當(dāng)是判斷口令是否正確,如果這個都不正確的話,就不再向下操作了。
為了講解方便,下面提供excelinsert.php開發(fā)完整的代碼:
<?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>的數(shù)據(jù)已在表中,請在excel文件里面刪除這一條后再添加!";
exit;
}
}
}
//附加表插入數(shù)據(jù)前處理
$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 = '';
}
//處理重復(fù)問題
if($bio2==$sheetData[count($sheetData)]['B']){
ShowMsg("不能重復(fù)添加內(nèi)容",'javascript:;');
exit;
}
//主表插入數(shù)據(jù)前處理
$arcrow = $dsql->GetOne("select id from `dede_archives` order by id desc");
if(!empty($arcrow)){
$arcid = $arcrow['id'];
}else{
$arcid = 0;
}
//微表插入數(shù)據(jù)前處理
$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');
//字段數(shù)量
$fieldnum = count($sheetData[1]);
$fields = $fieldvalue = '';
for ($i=0; $i < $fieldnum; $i++) {
$fields .= $sheetData[1][$alphalpha[$i]]. ',';
}
$fields = substr($fields, 0,-1);
//遍歷數(shù)組
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]]."' ";
}
//標(biāo)題
$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." 條數(shù)據(jù)!",'javascript:;');
}
}
}else{
echo "密碼或文件名錯誤!您無權(quán)做任何操作!";
}
?>
以上就是完整的把excel里面數(shù)據(jù)插入到數(shù)據(jù)庫主表dede_archives里面的代碼,是經(jīng)過實際測試的完全沒有問題,如果你做出來不行的話,可能是您引入的common.inc.php路徑和引入的PHPExcel類庫Classess類有問題,若有問題請檢查這兩個地方。
代碼分析
1)第一步先判斷問號后面是不是為空,即dopost=exdata&typeid=6&n=test1字符串是否為空,如果這個字符串都是空的話,其它,就不用操作了,直接通過出程序,顯示:echo "密碼或文件名錯誤!您無權(quán)做任何操作!";
只有當(dāng)if(!empty($_GET))條件成立時,才有可能進入插入操作。
然后,獲取typeid和do的值:
$typeid = $_GET['typeid']; $dopost = $_GET['do'];
因為下面要對要插入到數(shù)據(jù)庫表中數(shù)據(jù)時還要進行口令的判斷,所以,這里獲取do的值是必須的,但是,這里為什么一起要獲取欄目id的值呢?因為,這里基本上要到最后一步才使用,為什么不等到使用時再獲取呢?如果密碼不對或其它原因的話,不能進行插入操作,那不是白白獲取了$typeid的值,從代碼優(yōu)化的角度,這樣不是最優(yōu)的,但是,大家請注意,因為,下面要對獲取到的$GET的數(shù)組進行操作,所以,為了保險起見,這時大這個地方先獲取到欄目id的值,這樣可以保證不會在后面出錯,當(dāng)然,如果您在開發(fā)時,能保證不會出錯可以在使用$typeid時再獲取也可以。
然后,判斷口令是否正確,即if($dopost=="exdata")是否為真,若為真說明我們在瀏覽器地址欄輸入的口令就是正確的,否則,就是錯誤的,如果出錯出退出程序不做任何操作。
如果正確,則獲取n的值,文件excel的文件名$inputFileName。
然后,通過PHPExcel類獲取到excel文件里面的數(shù)據(jù)保存到數(shù)組$sheetData里面。
2)判斷要插入的數(shù)據(jù)是否已經(jīng)存在于表dede_addonshop里面。
查詢附加表dede_addonshop里面的字段bio2,bio1,并把查詢出來的一維數(shù)組放到二維數(shù)組$rowall里面。
因為,把一條數(shù)據(jù)插入到織夢系統(tǒng)里面后,其實,是在織夢的主表、附加表和微表進入了插入操作,所以,在插入前都要先判斷一下插入的數(shù)據(jù)是不是在這三個表中都已經(jīng)存在了,如果已經(jīng)存在了就不要進入插入操作了。
3)插入數(shù)據(jù)庫表時最大數(shù)據(jù)id的判斷
當(dāng)向主表或附加表或微表加插入數(shù)據(jù)庫前,還要判斷一下這時主表或附加表或微表里面最大的id,把這個id查詢出來,進入對比即:$id = max($aid,$arcid,$tinyid);
這樣對比以后獲取到的$id的值就是最大的,獲取這個最大的$id后,就可以在這個$id的基本上增加$id,例如,當(dāng)前表中最大的id為9,那么,下面我們在插入數(shù)據(jù)時對應(yīng)的id值就是從10開始,這是非常重要的,如果不做這個判斷,那么,就會把原來的數(shù)據(jù)給覆蓋掉。
3)遍歷數(shù)組$sheetData插入數(shù)據(jù)
因為,通過PHPExcel獲取到的數(shù)據(jù)是保存在$sheetData二維數(shù)據(jù)里面,類似array(array('a','b'),array('b','c')),所以,在遍歷這個數(shù)組,然后,把這個數(shù)組里面的數(shù)據(jù)插入到織夢的主表、微表和附加表里面。
這里要注意$id = $id+1,這行代碼為什么要做這行代碼,是因為,如果沒有這行代碼那么,在插入數(shù)據(jù)時id的值一直是同一個,例如,$id=9,這樣一直是9,這是不可能的,因為,一個網(wǎng)站面的每一篇文章的id都是不同的,如果全一樣的話,可能網(wǎng)站里面顯示數(shù)據(jù)就只有一條了,其它的全部被覆蓋掉了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
- 一般情況我們在批量導(dǎo)入文章或者是采集后入庫的文章需要批量操作的時候需要用到這個操作,那么dedecms如何把文章批量設(shè)為未審核的辦法,感興趣的同學(xué)一起跟隨小編來了解一2019-01-10
- 本問小編給大家分享了如何講dede已經(jīng)有存在數(shù)據(jù)庫的文章批量的設(shè)置為未審核的狀態(tài),方法和原理以及操作做了分享,需要的朋友參考下。2018-04-03
- 這篇文章主要為大家介紹了dedecms使用SQL命令批量替換指定字符串的方法,可以實現(xiàn)針對指定字符串的精確替換功能,是非常實用的技巧,需要的朋友可以參考下2015-01-13
DedeCms批量寫入數(shù)據(jù)的函數(shù)分析
這篇文章主要為大家介紹了DedeCms批量寫入數(shù)據(jù)的函數(shù),分析了函數(shù)的用法,對dedecms二次開發(fā)有一定參考借鑒價值,需要的朋友可以參考下2015-01-09- 這篇文章主要為大家介紹了dedecms批量替換文章中超鏈接的方法,涉及正則匹配與SQL調(diào)用的技巧,需要的朋友可以參考下2014-12-26
- 這篇文章主要為大家介紹了批量刪除織夢dedecms文檔搜索關(guān)鍵詞的方法,主要通過dedecms后臺的SQL命令界面執(zhí)行SQL語句來實現(xiàn),是非常實用的技巧,需要的朋友可以參考下2014-11-24
- 這篇文章主要為大家介紹了dedeCms批量修改文章發(fā)布時間的方法,需要的朋友可以參考下2014-07-16
- 遇到更換文件目錄或者更換空間域名的情況,常常導(dǎo)致dede圖片和縮略圖不能夠正常顯示,從而影響dede的正常使用,于是有必要批量替換圖片路徑2014-06-30
用數(shù)據(jù)庫批量修改替換dedecms文章標(biāo)題和內(nèi)容的步驟分享[圖文]
如果一個dedecms系統(tǒng)的門戶網(wǎng)站,里面的信息內(nèi)容,已經(jīng)成千上萬,當(dāng)有一天想要修改大部分文章中的信息時,單篇文章修改的方法不是太現(xiàn)在,那么現(xiàn)在給大家介紹一下用數(shù)據(jù)庫2019-02-26- 因為會員惡意注冊,發(fā)布信息特需要將這些會員刪除,手工刪太累??梢杂孟旅娴拇a批量刪除。2011-03-31

