PHPExcel自动导入数据到数据库

版权声明:我是锋子@FENGZI https://blog.csdn.net/weixin_37546664/article/details/72632442

接着上一篇来继续往下完善,上一篇是实现从表格里把数据获取到显示出来,显示出来没有多大意义,需要把数据导入到数据库,然后在后台展现出来,才算是完整。


在网上看了些资料,关于导入到数据库的写法有很多种,大都是利用循环通过索引列个数来获取的,例如这样:


<?php

$result = array(array('你好','我好','她好','也好','很好','逗号')); //模拟

foreach ($result as $key1 =>$vlas ) {
    $data['name'] = $vals[0],
    .......
}
类似于上面的那种写法!


我也尝试的试了下,数据完美的进入到了数据库;但是总感觉哪里不对劲儿?....我创建了一个excel表,在里面添加了100个字段,按着上面的写法,我就需要写一百个索引字段...太恐怖了,如果再多呢(一般不会有这么多的,假设)不敢想...,接着我对着代码进行了一番思考:为什么就不能自动获取列中的数据呢?不管有多少字段,我不同关心,直接自动获取就行了,然后拼装SQL(获取使用框架)进行存入就OK了,这多方便呢! 想想都感觉很美......


经过一阵儿“苦思冥想”,想明白一个事儿——获取表中数据,其实就是行和列的关系,把这个关系搞明白了,代码自然就有了


思路:

1. 通过PHPEcxcel获取到表格中的数据,返回的是一个二维数组(这个是自己拼装的),第一维数组表示行数,第二维表示每个行里面的列数(也代表字段数)

2. 利用双循环(也许有更好的方法)外层循环循环行数,内层循环循环列数,行列是对应的

3. 当循环列数据的时候,数据的个数和字段个数同样也是对应的(在存入数据库的时候,只存数据,不需要表头)

4. 用一个变量,来接收每次循环的列数据(用于最后的sql拼装)


代码如下:



<?php


//链接数据库
$coon = new mysqli('localhost','root','xxxxxx','test');
if ($coon->connect_error) echo 'not connect mysqli databases';
$coon->query("sets utf8");

//引入函数文件
 include "./functions.php";

 $files = empty($_FILES['excel']) ? '' : $_FILES['excel'];

//判断是否是有效的数据
if ($files && is_array($files) ) {
	
	$ext = pathInfo($files['name'], PATHINFO_EXTENSION);
	if ($ext === 'xlsx'  || $ext === 'xls' ) {
		
		//执行函数,从表格里读取到数据返回来结果
		$result = ToLeadExcel( $files['tmp_name']);

		if ( $result && is_array($result ) ) { 

			/**
			 * @这一步的目的是为了防止多条数据插入时,执行多次sql语句
			 * @这里也可以改写成用预处理来做
			 */
			$sql = "insert into test values";

				/**
				 * 理解行和列的关系
				 * @第一个循环循环最外面的行数
				 * @第二个循环循环行里面的列
				 * @每次循环列的时候,把每个列数据拼装,并保存到一个变量里
				 * @当内部列循环完以后,对变量里的数据进行sql的拼装,依次循环
				 * @最后:有多少行就拼装多少次,最后执行一次sql语句就行了
				 * @这一步也可以做个判断,当数据达到多少时,执行一次sql
				 */
				foreach ($result as $key1 => $res) {

					/**
					 * @ param $conn_str
					 * @ conn_str是对列数进行拼装
					 * @ 每次列数据执行完毕后,清空$conn_str变量里的数据
					 * @ 目的是为了防止每次的数据进行叠加
					 * @ 也是为了保证每次行循环时,都是当前列的数据
					 */
					$conn_str = '';

					if($key1 !== 1 ) { //这一层判断是为了剔除表格头
						foreach ($res as $key2 => $res_res) {
							if ( !empty($res_res)){
								$conn_str .= ",'$res_res'";
							}
						}
						$sql .= '(null,' .ltrim($conn_str, ','). '),';
					}	
				}
		}


		/**
		 * 最后对插入数据结果进行判断
		 * return true or false
		 */
		$if_result = $coon->query(rtrim($sql, ','));
		if ($if_result) {
			echo '添加成功';
		} else {
			echo '添加失败';
		}
	}
	
}

使用框架的批量插入:

1. TP3.2可以考虑使用 addAll()方法

2. yii2.0批量插入数据可以如下写:

Yii::$app->db->createCommand()->batchInsert('user', ['name', 'age'], [  
    ['test01', 30],  
    ['test02', 20],  
    ['test03', 25],  
])->execute();

相互学习,相互交流,有更好实现方法的朋友请留言!


猜你喜欢

转载自blog.csdn.net/weixin_37546664/article/details/72632442