请选择 进入手机版 | 继续访问电脑版

织梦DEDECMS批量导入excel数据到后台文章系统的开发教程

[复制链接]
查看2342 | 回复0 | 2020-3-3 13:46 | 显示全部楼层 |阅读模式
织梦DEDECMS批量导入excel数据到后台文章系统的开发教程
对于一些企业网站或者淘宝客类网站经常会需要将一些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数据到后台文章系统的开发教程

织梦DEDECMS批量导入excel数据到后台文章系统的开发教程

这些代码全是PHPExcel类里面提供的,所以,这里不用多解释。
2) 开发插入数据代码:
为了讲解方式,我们将直接以这种形式来插入数据:
表示通过文件excelinert.php插入excel里面的名称为test1的里面的数据,把这些数据插入到织梦数据库表dede_archvies里面,栏目id为6的表中,其中,dopost=exdata表示插入数据口令,因为,作一个判断的话,那什么人也能插入到您的数据库表里面数据了,这是非常可怕的,就像一个网站没有后台一样,这是不是非常可能谁都可以进入网站后台里面,同样的,如果不加这个口令的话,谁都可以插入数据,这是不安全的。
所以,在插入数据前先通过$GET超级数组获取到typeid、do和n的值,然后,进行对比看看有没有权限进行插入数据库操作,第一个判断应当是判断口令是否正确,如果这个都不正确的话,就不再向下操作了。
为了讲解方便,下面提供excelinsert.php开发完整的代码:
  1. 001
  2. header("Content-type:text/html;charset=utf8");
  3. 002

  4. 003
  5. require_once('/../dedecms/include/common.inc.php');
  6. 004

  7. 005
  8. error_reporting(E_ALL);
  9. 006

  10. 007
  11. set_time_limit(0);
  12. 008

  13. 009
  14. date_default_timezone_set('Europe/London');
  15. 010

  16. 011
  17. /** Include path **/
  18. 012

  19. 013
  20. set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
  21. 014

  22. 015
  23. /** PHPExcel_IOFactory */
  24. 016

  25. 017
  26. include 'PHPExcel/IOFactory.php';
  27. 018

  28. 019
  29. if(!empty($_GET)){
  30. 020

  31. 021
  32. $typeid = $_GET['typeid'];
  33. 022

  34. 023
  35. $dopost = $_GET['do'];
  36. 024

  37. 025
  38. if($dopost == "exdata"){
  39. 026

  40. 027
  41. if(!empty($_GET['n'])){
  42. 028

  43. 029
  44. $inputFileName = './'.$_GET['n'].'.xlsx';
  45. 030

  46. 031
  47. $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
  48. 032

  49. 033
  50. $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
  51. 034

  52. 035
  53. $rowarr=array();
  54. 036

  55. 037
  56. $dsql->Execute('all',"select bio2,bio1 from `dede_addonshop`");
  57. 038

  58. 039
  59. while ($rowall = $dsql->GetArray('all')) {
  60. 040

  61. 041
  62. $rowarr[]=$rowall;
  63. 042

  64. 043
  65. }
  66. 044

  67. 045
  68. foreach ($sheetData as $v) {
  69. 046

  70. 047
  71. foreach ($rowarr as $vt) {
  72. 048

  73. 049
  74. if(in_array($v['B'],$vt)&&$v['A']==$vt['bio1']){
  75. 050

  76. 051
  77. echo "货号为:".$v['B']."
  78. 052
  79. 厂商为:".$v['A']."
  80. 053
  81. 的数据已在表中,请在excel文件里面删除这一条后再添加!";
  82. 054

  83. 055
  84. exit;
  85. 056
  86. }
  87. 057

  88. 058
  89. }
  90. 059
  91. }
  92. 060

  93. 061
  94. //附加表插入数据前处理
  95. 062

  96. 063
  97. $row = $dsql->GetOne("select aid,bio2 from `dede_addonshop` order by aid desc");
  98. 064

  99. 065
  100. if(!empty($row)){
  101. 066

  102. 067
  103. $aid = $row['aid'];
  104. 068

  105. 069
  106. $bio2 = $row['bio2'];
  107. 070

  108. 071
  109. }else{
  110. 072

  111. 073
  112. $aid = 0;
  113. 074

  114. 075
  115. $bio2 = '';
  116. 076

  117. 077
  118. }
  119. 078

  120. 079
  121. //处理重复问题
  122. 080

  123. 081
  124. if($bio2==$sheetData[count($sheetData)]['B']){
  125. 082

  126. 083
  127. ShowMsg("不能重复添加内容",'javascript:;');
  128. 084

  129. 085
  130. exit;
  131. 086

  132. 087
  133. }
  134. 088

  135. 089
  136. //主表插入数据前处理
  137. 090

  138. 091
  139. $arcrow = $dsql->GetOne("select id from `dede_archives` order by id desc");
  140. 092

  141. 093
  142. if(!empty($arcrow)){
  143. 094

  144. 095
  145. $arcid = $arcrow['id'];
  146. 096

  147. 097
  148. }else{
  149. 098

  150. 099
  151. $arcid = 0;
  152. 100

  153. 101
  154. }
  155. 102

  156. 103
  157. //微表插入数据前处理
  158. 104

  159. 105
  160. $tinyrow = $dsql->GetOne("select id from `dede_arctiny` order by id desc");
  161. 106

  162. 107
  163. if(!empty($tinyrow)){
  164. 108

  165. 109
  166. $tinyid = $tinyrow['id'];
  167. 110

  168. 111
  169. }else{
  170. 112

  171. 113
  172. $tinyid = 0;
  173. 114

  174. 115
  175. }
  176. 116

  177. 117
  178. //找出最大的id
  179. 118

  180. 119
  181. $id = max($aid,$arcid,$tinyid);
  182. 120

  183. 121
  184. $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');
  185. 122

  186. 123
  187. //字段数量
  188. 124

  189. 125
  190. $fieldnum = count($sheetData[1]);
  191. 126

  192. 127
  193. $fields = $fieldvalue = '';
  194. 128

  195. 129
  196. for ($i=0; $i < $fieldnum; $i++) {
  197. 130

  198. 131
  199. $fields .= $sheetData[1][$alphalpha[$i]]. ',';
  200. 132

  201. 133
  202. }
  203. 134

  204. 135
  205. $fields = substr($fields, 0,-1);
  206. 136

  207. 137
  208. //遍历数组
  209. 138

  210. 139
  211. foreach ($sheetData as $value) {
  212. 140

  213. 141
  214. $pubdate = GetMkTime(GetDateTimeMk(time()));
  215. 142

  216. 143
  217. $click = mt_rand(50, 200);
  218. 144

  219. 145
  220. if($value['A']=='bio1'|$value['A']=='厂商'){
  221. 146

  222. 147
  223. continue;
  224. 148

  225. 149
  226. }
  227. 150

  228. 151
  229. $id = $id+1;
  230. 152

  231. 153
  232. //获取字段值$value['A'];
  233. 154

  234. 155
  235. for ($i=0; $i < $fieldnum; $i++) {
  236. 156

  237. 157
  238. $fieldvalue .= " ,'".$value[$alphalpha[$i]]."' ";
  239. 158

  240. 159
  241. }
  242. 160

  243. 161
  244. //标题
  245. 162

  246. 163
  247. $C = trim($value['C']);
  248. 164

  249. 165
  250. //保存到主表
  251. 166

  252. 167
  253. $senddate = time();
  254. 168

  255. 169
  256. $arcquery = "INSERT INTO `dede_archives`(id,typeid,title,mid,channel,pubdate,senddate,click,ismake)VALUES ('$id','$typeid','$C','1','6','$pubdate','$senddate','$click','-1');";
  257. 170

  258. 171
  259. $dsql->ExecuteNoneQuery($arcquery);
  260. 172

  261. 173
  262. //保存到附近加表
  263. 174

  264. 175
  265. $query = "INSERT INTO `dede_addonshop`(aid,typeid,$fields)
  266. 176

  267. 177
  268. VALUES ('$id','$typeid'{$fieldvalue});";
  269. 178

  270. 179
  271. $dsql->ExecuteNoneQuery($query);
  272. 180

  273. 181
  274. $fieldvalue = '';
  275. 182

  276. 183
  277. //保存到微表
  278. 184

  279. 185
  280. $tinyquery = "INSERT INTO `dede_arctiny`(id,typeid,channel,mid,senddate)VALUES ('$id','$typeid','6','1','$senddate');";
  281. 186

  282. 187
  283. $dsql->ExecuteNoneQuery($tinyquery);
  284. 188

  285. 189
  286. }
  287. 190

  288. 191
  289. $num = count($sheetData)-2;
  290. 192

  291. 193
  292. ShowMsg("恭喜,成功插入   ".$num."   条数据!",'javascript:;');
  293. 194

  294. 195
  295. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

UID
1
贡献
387
丢币
38902
主题
4607
回帖
116
注册时间
2018-9-25
最后登录
2024-4-16