I'm Sham
一个在通往码农道路上走走停停的行政文员

PHP导入和生成csv表格

2021-04-15更新

因为今天在windows里测试导入时发现,同一个文件,到windows导入就会中文乱码,需要增加mb_convert_encoding($data, “UTF-8”, “GBK”);来转变数据编码

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里面的一行内容
//20210415加入mb_convert_encoding($data, "UTF-8", "GBK");防止中文乱码导致导入失败
      $staff_list[] = mb_convert_encoding($data, "UTF-8", "GBK");
    }
    $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文件内容如下:

工号姓名密码用户类型
000100010001管理员

这样,通过上传页,上传后,就能将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;
    }
赞(1) 赏杯咖啡!
未经允许不得转载:Sham@双目瞿 » PHP导入和生成csv表格

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

如果你觉得文章好,请赏1杯速溶咖啡给Sham吧!

微信扫一扫打赏