DEDE Excel データをバッチでバックグラウンドにインポートするにはどうすればよいですか?
Excel データをバックエンド記事システムにバッチ インポートするための DEDE 開発チュートリアル
一部の企業 Web サイトや淘宝網の顧客 Web サイトでは、多くの場合、いくつかのデータをインポートする必要があります。 Excel データを Web サイトにバッチインポートします。Web サイトのバックグラウンドからデータを 1 つずつ入力して追加するのではなく、バッチインポートによって時間を節約できます。一定の参照値があり、興味のある友人は参照できます。
推奨学習: Dream Weaver cms
一部の企業 Web サイトやタオバオの顧客 Web サイトでは、Excel データをバッチで Web サイトにインポートする必要があることがよくあります。これにより、1 つずつ入力して追加するのではなく、バッチ インポートによって時間を節約できます。ウェブサイトの背景データから。このチュートリアルでは、Excel データを Dreamweaver システム (dedecms) にインポートしてバッチ データ インポートを開発する例を使用します。Excel データが Dreamweaver のメイン テーブル dede_archives にインポートされることを前提としています (マイクロ テーブルと追加テーブルもあり、メイン テーブルも存在します)。ここでの table は、これら 3 つのテーブルを表すために使用されます)。
Excel データの一括インポートの原理: Excel にクエリを実行することで、データを 1 つずつ読み取り、開発した php プログラムを通じてテーブルにデータをインポートします。
上記の原則により、Excel データの一括インポートを 2 つの部分に分割できることがわかりました。1 つは Excel からデータを読み取るプログラムの開発で、もう 1 つはデータをインポートするためのプログラムの開発です。読み取ったデータをデータベーステーブル dede_archives 内に挿入します。
Excel からデータを読み取るプログラムの開発
実は、外国人がすでにこのステップの開発を手伝ってくれています。この外国人は、PHPExcel クラスと呼ばれる Excel データ テーブルを読み取るための特別なプログラム セットを開発しました。図書館。
この Excel クラス ライブラリには、ここでは紹介しきれない他の機能も含まれていますので、ダウンロードしてご覧ください。ここでは Excel の読み込みについてのみ説明します。
読み取ったデータをメイン テーブル dede_archives に挿入します
PHPExcel クラス ライブラリで提供されるクラスを通じてデータを読み取った後、このステップではデータをデータベース テーブルに挿入します。このチュートリアルの開発は実際にこの部分の開発、Excelから読み込んだデータをメインテーブルに挿入するプログラムの開発です。
説明の便宜上、データベーステーブルに挿入するデータのファイル名をexcinert.phpとし、次にこのファイルにプログラム開発を記述し、読み取ったデータをデータベーステーブルに挿入していきます。
挿入データ開発原則
1) 開発前の準備:
文字化けを避けるためにエンコーディングを統一するために、excelinsert.phpにヘッダーエンコーディングを追加します: header(" Content-type:text/html;charset=utf8");
DreamWeaver システムのパブリック ファイル common.inc.php を導入します。なぜこのファイルを導入する必要があるのですか? データベース テーブルを挿入する前に、ホームページへ ウェブサイトのデータベースに接続する必要があり、接続しないとデータベースのデータを挿入することができません。 Dreamweaver システムを dedecms にインストールしたため、パスにディレクトリ名 dedecms が含まれているため、インポートされたファイルのパスを独自のパスに変更する必要があることに注意してください。ルート ディレクトリにインストールする場合は、このパスを削除してください。
エラーレポートの設定、タイムゾーンの設定、プログラムの実行時間の設定、もちろんこの実行時間は設定する必要はありません、PHPExcelクラスのクラスインベントリのパスを設定します。 IOFactory.php ファイル。このファイルが最も重要です。この関数はこのファイルを通じて処理されます。設定コードは次のとおりです:
これらのコードはすべて PHPExcel クラスで提供されるため、ここでのこれ以上の説明は必要ありません。
2) データ挿入コードを開発します:
は、ファイル Excelinert.php を通じて test1 という名前のデータを Excel に挿入し、これらのデータを Dreamweaver データベース テーブル dede_archvies の列に挿入することを意味します。 ID 6 のテーブル、dopost=exdata は、データ パスワードを挿入することを意味します。判断すれば、誰でもデータベース テーブルにデータを挿入できるためです。これは非常に恐ろしいことです。バックエンドにも同じことが当てはまります。誰でも Web サイトのバックエンドにアクセスできる可能性はありますか? 同様に、このパスワードを追加しないと、誰でもデータを挿入できてしまい、安全ではありません。
したがって、データを挿入する前に、まず $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クラスに問題がある可能性があります。問題がある場合は、この 2 か所を確認してください。
コード分析
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 中国語 Web サイトの他の関連記事を参照してください。