Sham以前用的是PHPExcel来实现导入excel到数据库的功能,PHPExcel的话,功能比较强大,但是同样,需要引用这个文件。
事实上,PHP原生就能直接实现导入csv文件功能,而csv的话,如果要求不高,完全能替代掉excel来实现数据批量导入。
这里,就来记录下如何导入和生成csv文件。
首先是导入
Sham用的是layui,所以这里放的是layui的上传方法:
上传页:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>人员清单</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="layui.css" media="all">
<script src="layui.js" charset="utf-8"></script>
<script src="jquery-3.1.1.min.js"></script>
<!-- 注意:如果你直接复制所有代码到本地,上述路径需要改成你本地的 -->
</head>
<body>
<from class="layui-form">
<div class="layui-inline">
<label class="layui-form-label">上传清单</label>
<div class="layui-inline" style="width:100px;">
<select id="uptype" name="uptype">
<option value="all">全部更新</option>
<option value="userright">更新用户分类</option>
</select>
</div>
<div class="layui-inline">
<button type="button" class="layui-btn layui-btn-normal" id="chooseexcel">选择文件</button>
<button type="button" class="layui-btn" id="startupload">开始上传</button>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">添加用户</label>
<div class="layui-inline">
<button type="button" class="layui-btn" id="adduser">添加新员工</button>
</div>
</div>
</form>
<script>
layui.use('upload', function(){
var $ = layui.jquery
,upload = layui.upload;
//选完文件后不自动上传
var uploadInst = upload.render({
elem: '#chooseexcel'
,method:'post'
,url: 'csvtodb.php' //改成您自己的上传接口
,auto: false
,accept: 'file'
,field:'staffs'
,bindAction: '#startupload'
,before: function(obj){
this.data.uptype = $('#uptype').val(); //通过分类来更新数据
}
,done: function(res){
layer.msg(res.msg,{icon: 1, time: 2000},function(){location.reload();});
console.log(res)
}
,error: function(res){
console.log(res)
}
});
});
</script>
</body>
</html>
接收页
<?php
//导入员工信息
if(isset($_FILES['staffs'])){ //首先判断是否存在staffs文件上传过来
include_once('dbcon.php');
//首先获取所有员工工号,拼接后用于判断导入的数据,是否有员工已经存在于数据库
$sql1 = "SELECT * FROM `s_staffs`";
$res1 = $con->query($sql1);
if($res1){
while ($row = mysqli_fetch_array($res1))
{
$checkitem=md5($row["userid"]);
$checkitems[$checkitem]=$row["id"];
}
}
//获取上传的文件
$staffs = $_FILES['staffs']['tmp_name'];
$file =fopen($staffs,'r'); //打开着上传的临时文件
while ($data = fgetcsv($file)) { //每次读取CSV里面的一行内容
$staff_list[] = $data;
}
$sqls='';
$count=count($staff_list);
if($staff_list[0][1]=='姓名' && $staff_list[0][2]=='密码'){ //通过判断第一行明细来判断是不是正确的csv文件,避免传错
$done =1;
for($i=1;$i<$count;$i++){
$thisrow = $staff_list[$i];
$checkitem1 = md5($thisrow[0]); //拼接导入文件中,当前行的工号
if(isset($checkitems[$checkitem1])){ //判断是否已经存在当前行用户信息,如已经存在,则执行更新,如没有,则新插入
$sql2 = "UPDATE `s_staffs` SET `username`='".$thisrow[1]."',`password`='".$thisrow[2]."',`usertype`='".$thisrow[3]."'";
$res2 = $con->query($sql2);
$done++;
}else{
$sqls .= "('".$thisrow[0]."','".$thisrow[1]."','".$thisrow[2]."','".$thisrow[3]."'),";
$done++;
}
}
$sql = "INSERT INTO `s_staffs`(`userid`, `username`, `password`, `usertype`) VALUES". rtrim($sqls,',');
$res = $con->query($sql);
if($done == $count){
fclose($file); //关闭文件
exit('{"code": 0,"msg": "导入成功啦!"}');
}else{
fclose($file); //关闭文件
exit('{"code": 1,"msg": "导入失败啦,请检查文件后重试!"}');
}
}else{
exit('{"code": 1,"msg": "文件错误,请检查是否导入错误文件,或文件第一行是否被修改"}');
}
}
这里s_staffs数据库表字段是:id,userid,username,password,usertype,这几个
然后csv文件内容如下:
工号 | 姓名 | 密码 | 用户类型 |
0001 | 0001 | 0001 | 管理员 |
这样,通过上传页,上传后,就能将csv文件内数据导入到数据库表s_staffs啦。
接下来是生成csv
Sham的理解就是先拼接成长字符串,每行数据代表csv中的一行,然后每行里的英文‘,’逗号分隔的,表示当前行每一个单元格(如果用excel打开的话),然后再把他输出成文件。
<?php
include('dbcon.php');
$str = '编号,工号,姓名,用户类型'."\n";
$sql = "SELECT * FROM `s_staffs` WHERE `status` !='已登录'";
$res = $con->query($sql);
while($row = mysqli_fetch_array($res)){
$str .= $row['id'].','.$row['userid'].','.$row['username'].','.$row['usertype']."\n";
}
$filename = '员工清单_下载于_'.date("Y-m-d").'.csv';
ExportCSV($filename, $str); //执行导出函数
function ExportCSV($filename, $data)
{
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=".$filename); // Content-Disposition指的是属性名,attachment指的是以附件形式下载,filename为默认保存文件名
header('Cache-Control:must-revalidate,post-check=0,pre-check=0'); // Cache-Control:must-revalidate强制不缓存,post-check=0,pre-check=0是IE5中的防缓存
header('Expires:0'); // 不缓存
header('Pragma:public');
echo chr(0xEF).chr(0xBB).chr(0xBF); // 解决乱码
echo $data;
}