Maison >Tutoriel CMS >DEDECMS >Comment DEDE importe-t-il par lots des données Excel en arrière-plan ?

Comment DEDE importe-t-il par lots des données Excel en arrière-plan ?

藏色散人
藏色散人original
2020-01-02 09:26:123226parcourir

Comment DEDE importe-t-il par lots des données Excel en arrière-plan ?

DEDE Comment importer par lots des données Excel en arrière-plan ?

Tutoriel de développement DEDE pour l'importation par lots de données Excel dans le système d'articles backend

Pour certains sites Web d'entreprise ou sites Web de clients Taobao, il est souvent nécessaire d'en importer L'importation par lots de données Excel sur le site Web, permettant de gagner du temps grâce à l'importation par lots au lieu de saisir et d'ajouter des données une par une à partir de l'arrière-plan du site Web, a une certaine valeur de référence, les amis intéressés peuvent se référer à

Apprentissage recommandé : Dream Weaver cms

Pour certains sites Web d'entreprise ou sites Web de clients Taobao, il est souvent nécessaire d'importer certaines données Excel dans le site Web par lots. Cela permet de gagner du temps grâce à l'importation par lots au lieu de les saisir et de les ajouter une par une. à partir des données backend du site Web. Ce didacticiel utilise l'exemple d'importation de données Excel dans le système Dreamweaver (dedecms) pour développer l'importation de données par lots. On suppose que les données Excel sont importées dans la table principale de Dreamweaver dede_archives (il existe également des micro-tables et des tables supplémentaires, ainsi que la table principale. table est utilisé ici pour représenter ces trois tableaux) à l’intérieur.

Principe de l'importation par lots de données Excel : en interrogeant Excel, lisez les données une par une, puis importez les données dans le tableau via le programme php que nous avons développé.

Grâce aux principes ci-dessus, nous savons que nous pouvons diviser l'importation par lots de données Excel en deux parties. Une partie consiste à développer un programme pour lire des données à partir d'Excel, et l'autre partie consiste à développer un programme pour. insérez les données lues dans la table de base de données dede_archives.

Développement d'un programme pour lire des données depuis Excel

En fait, un étranger nous a déjà aidé à développer cette étape. Cet étranger a développé un ensemble de programmes spécifiquement pour lire des tableaux de données Excel appelés PHPExcel. bibliothèque de classe.

Cette bibliothèque de classes Excel comprend également d'autres fonctions. Je ne les présenterai pas une par une ici. Vous pouvez les télécharger et y jeter un œil. Ici, nous expliquons uniquement la lecture d'Excel.

Insérer les données lues dans la table principale dede_archives

Après avoir lu les données via la classe fournie dans la bibliothèque de classes PHPExcel, cette étape consiste à insérer les données dans la table de la base de données, donc, le le développement de ce tutoriel développe actuellement cette partie ; le développement du programme pour insérer les données lues depuis Excel dans la table principale.

Pour faciliter l'explication, nous nommons le fichier qui insère les données dans la table de la base de données excelinert.php. Nous allons maintenant entrer le développement du programme dans ce fichier et insérer les données lues dans la table de la base de données.

Principe de développement des données d'insertion

1) Préparation avant développement :

Ajouter un encodage d'en-tête à excelinsert.php afin d'unifier l'encodage pour éviter les caractères tronqués : header(" Content-type:text/html;charset=utf8");

Introduisez le fichier public common.inc.php du système DreamWeaver. Pourquoi devrions-nous introduire ce fichier ? Avant d'insérer la table de la base de données, la page d'accueil page Vous devez vous connecter à la base de données du site Web. Si vous ne vous connectez pas, vous ne pourrez pas insérer les données de la base de données. Veuillez noter que le chemin du fichier importé doit être remplacé par le vôtre, car j'ai installé le système DreamWeaver dans dedecms, donc le nom du répertoire dedecms est dans le chemin. Si vous l'installez dans le répertoire racine, supprimez ce chemin.

Définissez le rapport d'erreurs, définissez le fuseau horaire et définissez la durée d'exécution du programme. Bien sûr, cette durée d'exécution n'a pas besoin d'être définie. Définissez le chemin d'inventaire de la classe PHPExcel, puis introduisez le. Fichier IOFactory.php. Ce fichier est le plus important. Cette fonction est traitée via ce fichier. Les codes de configuration sont les suivants :

Ces codes sont tous fournis dans la classe PHPExcel, aucune explication supplémentaire n'est donc nécessaire ici. .

2) Développer le code d'insertion des données :

signifie insérer les données nommées test1 dans Excel via le fichier excelinert.php, et insérer ces données dans la table dede_archvies de la base de données Dreamweaver, colonne Dans le table avec l'ID 6, dopost=exdata signifie insérer un mot de passe de données, car si vous portez un jugement, n'importe qui peut insérer des données dans votre table de base de données. C'est très effrayant, tout comme un site Web sans. Il en va de même pour le backend. Est-il possible que n'importe qui puisse accéder au backend du site Web ? De même, si vous n'ajoutez pas ce mot de passe, n'importe qui peut insérer des données, ce qui est dangereux.

Donc, avant d'insérer des données, obtenez d'abord les valeurs de typeid, do et n via le super tableau $GET, puis comparez pour voir si vous avez l'autorisation d'insérer dans la base de données. Il s'agit de juger le mot de passe. Est-il correct ? Si ce n'est pas correct, il n'y aura pas d'autres opérations.

Pour faciliter l'explication, le code complet pour le développement d'excelinsert.php est fourni ci-dessous :

<?php
header("Content-type:text/html;charset=utf8");
require_once(&#39;/../dedecms/include/common.inc.php&#39;);
  
error_reporting(E_ALL);
set_time_limit(0);
date_default_timezone_set(&#39;Europe/London&#39;);
/** Include path **/
set_include_path(get_include_path() . PATH_SEPARATOR . &#39;../../../Classes/&#39;);
/** PHPExcel_IOFactory */
include &#39;PHPExcel/IOFactory.php&#39;;
if(!empty($_GET)){
    $typeid = $_GET[&#39;typeid&#39;];
    $dopost = $_GET[&#39;do&#39;];
    if($dopost == "exdata"){
            if(!empty($_GET[&#39;n&#39;])){
                $inputFileName = &#39;./&#39;.$_GET[&#39;n&#39;].&#39;.xlsx&#39;;
                $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
                $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
                $rowarr=array();
                $dsql->Execute(&#39;all&#39;,"select bio2,bio1 from `dede_addonshop`");
                while ($rowall = $dsql->GetArray(&#39;all&#39;)) {
                      $rowarr[]=$rowall;
                }
foreach ($sheetData as $v) {
    foreach ($rowarr as $vt) {
        if(in_array($v[&#39;B&#39;],$vt)&&$v[&#39;A&#39;]==$vt[&#39;bio1&#39;]){
            echo "货号为:".$v[&#39;B&#39;]."<br>厂商为:".$v[&#39;A&#39;]."<br>的数据已在表中,请在excel文件里面删除这一条后再添加!";
            exit;
        }
    }
}
                //附加表插入数据前处理
                $row = $dsql->GetOne("select aid,bio2 from `dede_addonshop` order by aid desc");
                if(!empty($row)){
                    $aid = $row[&#39;aid&#39;];
                    $bio2 = $row[&#39;bio2&#39;];
                }else{
                    $aid = 0;
                    $bio2 = &#39;&#39;;
                }
                //处理重复问题
                 if($bio2==$sheetData[count($sheetData)][&#39;B&#39;]){
                  ShowMsg("不能重复添加内容",&#39;javascript:;&#39;);
                  exit;
                  }
               //主表插入数据前处理
                $arcrow = $dsql->GetOne("select id from `dede_archives` order by id desc");
                if(!empty($arcrow)){
                    $arcid = $arcrow[&#39;id&#39;];
                }else{
                    $arcid = 0;
                }
               //微表插入数据前处理
                $tinyrow = $dsql->GetOne("select id from `dede_arctiny` order by id desc");
                if(!empty($tinyrow)){
                    $tinyid = $tinyrow[&#39;id&#39;];
                }else{
                    $tinyid = 0;
                }
                //找出最大的id
               $id = max($aid,$arcid,$tinyid);
               $alphalpha = array(&#39;A&#39;,&#39;B&#39;,&#39;C&#39;,&#39;D&#39;,&#39;E&#39;,&#39;F&#39;,&#39;G&#39;,&#39;H&#39;,&#39;I&#39;,&#39;J&#39;,&#39;K&#39;,&#39;L&#39;,&#39;M&#39;,&#39;N&#39;,&#39;O&#39;,&#39;P&#39;,&#39;Q&#39;,&#39;R&#39;,&#39;S&#39;,&#39;T&#39;,&#39;U&#39;,&#39;V&#39;,&#39;W&#39;,&#39;X&#39;,&#39;Y&#39;,&#39;Z&#39;,&#39;AA&#39;,&#39;AB&#39;,&#39;AC&#39;,&#39;AD&#39;,&#39;AE&#39;,&#39;AF&#39;,&#39;AG&#39;,&#39;AH&#39;,&#39;AI&#39;,&#39;AJ&#39;,&#39;AK&#39;,&#39;AL&#39;,&#39;AM&#39;,&#39;AN&#39;,&#39;AO&#39;,&#39;AP&#39;,&#39;AQ&#39;,&#39;AR&#39;,&#39;AS&#39;,&#39;AT&#39;,&#39;AU&#39;,&#39;AV&#39;,&#39;AW&#39;,&#39;AX&#39;,&#39;AY&#39;,&#39;AZ&#39;);
               //字段数量
               $fieldnum = count($sheetData[1]);
               $fields = $fieldvalue = &#39;&#39;;
               for ($i=0; $i < $fieldnum; $i++) {
                      $fields .= $sheetData[1][$alphalpha[$i]]. &#39;,&#39;;
                 }
               $fields = substr($fields, 0,-1);
              //遍历数组
              foreach ($sheetData as $value) {
                   $pubdate = GetMkTime(GetDateTimeMk(time()));
                   $click = mt_rand(50, 200);
                     if($value[&#39;A&#39;]==&#39;bio1&#39;|$value[&#39;A&#39;]==&#39;厂商&#39;){
                                continue;
                            }
                      $id = $id+1;
                       //获取字段值$value[&#39;A&#39;];
                        for ($i=0; $i < $fieldnum; $i++) {
                               $fieldvalue .= " ,&#39;".$value[$alphalpha[$i]]."&#39; ";
                         }
                     //标题
                     $C = trim($value[&#39;C&#39;]);
                    //保存到主表
                     $senddate = time();
                     $arcquery = "INSERT INTO `dede_archives`(id,typeid,title,mid,channel,pubdate,senddate,click,ismake)VALUES (&#39;$id&#39;,&#39;$typeid&#39;,&#39;$C&#39;,&#39;1&#39;,&#39;6&#39;,&#39;$pubdate&#39;,&#39;$senddate&#39;,&#39;$click&#39;,&#39;-1&#39;);";
                      $dsql->ExecuteNoneQuery($arcquery);
                    //保存到附近加表
                    $query = "INSERT INTO `dede_addonshop`(aid,typeid,$fields)
                    VALUES (&#39;$id&#39;,&#39;$typeid&#39;{$fieldvalue});";
                    $dsql->ExecuteNoneQuery($query);
                    $fieldvalue = &#39;&#39;;
                    //保存到微表
                    $tinyquery = "INSERT INTO `dede_arctiny`(id,typeid,channel,mid,senddate)VALUES (&#39;$id&#39;,&#39;$typeid&#39;,&#39;6&#39;,&#39;1&#39;,&#39;$senddate&#39;);";
                    $dsql->ExecuteNoneQuery($tinyquery);
                 }
        $num = count($sheetData)-2;
        ShowMsg("恭喜,成功插入   ".$num."   条数据!",&#39;javascript:;&#39;);
      }
    }
}else{
    echo "密码或文件名错误!您无权做任何操作!";
}
?>

Ce qui précède est le code complet pour insérer des données dans Excel dans la table de base de données principale dede_archives, qui a été réellement testé Il n'y a aucun problème. Si vous n'y parvenez pas, il peut y avoir un problème avec le chemin common.inc.php que vous avez introduit et la classe Classes de la bibliothèque de classes PHPExcel que vous avez introduite. veuillez vérifier ces deux endroits.

Analyse du code

1)第一步先判断问号后面是不是为空,即dopost=exdata&typeid=6&n=test1字符串是否为空,如果这个字符串都是空的话,其它,就不用操作了,直接通过出程序,显示:echo "密码或文件名错误!您无权做任何操作!";

只有当if(!empty($_GET))条件成立时,才有可能进入插入操作。

然后,获取typeid和do的值:

$typeid = $_GET[&#39;typeid&#39;];
$dopost = $_GET[&#39;do&#39;];

因为下面要对要插入到数据库表中数据时还要进行口令的判断,所以,这里获取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都是不同的,如果全一样的话,可能网站里面显示数据就只有一条了,其它的全部被覆盖掉了。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn