PHP 导入excel,将数据存入数据库

一.前端代码

1).基于Boostrap的BootstrapDialog

/*导入Excel*/ $('#btnExcel_add').click(function () {

// fileName为模板名字

var url = "assessment/template/bkhdepartment_import_dialog.php?ac=" + "<?php echo $ac;?>" + "&fileurl=" + "<?php echo $fileurl;?>"+"&fileName=被考核者";

BootstrapDialog.show({

    title:"导入", cssClass: 'select-dialog',

   message: $('<div></div>').load(url),

    buttons: [{

    label: '确 定',

   cssClass: 'btn-sm btn-primary',

    action: function (dlg) {

    var formData = new FormData($("#addExcelForm")[0]);

    //ajax上传文件要用此方法

    $.ajax({

    url: addExcelUrl,

    type: 'POST',

    data: formData,

    async: false,

    cache: false,

    contentType: false,

    processData: false,

    success: function (msg) {

    var msg = JSON.parse(msg);

    //把字符串转成json

    if (msg.message == 'success') {

    hjmsComponent.msgDialog(msg.date, refresh_form);

    } else {

    toastr.error(msg.date);

   } },

  error: function (msg) { alert(msg);

   } }); } },

   { label: '关 闭',

   cssClass: 'btn-sm btn-link',

   action: function (dlg) {

   dlg.close();

   } }] }) });

2)其中bkhdepartment_import_dialog为:

<form class="form-horizontal" id="addExcelForm" enctype="multipart/form-data">
    <div class="modal-body" style="font-family: microsoft yahei;color: #666666;text-align: center;font-size: 14px">
        <table style="margin: auto">
            <tr>
                <td>导入文件:</td>
                <td >
                    <input type="text" size="20" name="upfile" id="upfile" style="border:1px solid #ccc;border-               radius: 4px;margin-left: 5px">
                    <input type="button" value="浏览" onclick="path.click()" style="margin-left:5px;width:45px;border:1px solid #ccc;border-radius: 4px;background:#fff">
                    <input type="file" id="path" style="display:none" onchange="upfile.value=this.value" name="myfile" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
                </td>
            </tr>
        </table>
        <div style="padding-top: 20px;font-size: 14px">
            <a href="download/附件/Excel导入模板/<?php echo $_GET['fileName'];?>.xlsx" download="<?php echo $_GET['fileName'];?>.xlsx" style="vertical-align: middle">下载导入模板</a>
            <span style="padding-left:20px;color: red;vertical-align: middle">注意:支持xls和xlsx格式</span>
        </div>
    </div>
</form>

二.后端暴露接口

mod_addExcel()
 //判断是否选择了要上传的表格
    if (empty($_POST['upfile'])) {
        $back = array(
            'message' => 'error',
            'date' => '上传文件不能为空'
        );
        echo json_encode($back);
        exit();
    }

    //获取表格的大小,限制上传表格的大小5M
    $file_size = $_FILES['myfile']['size'];
    if ($file_size > 5 * 1024 * 1024) {
        $back = array(
            'message' => 'error',
            'date' => '文件大小不能超过5M'
        );
        echo json_encode($back);
        exit();
//        echo '文件大小不能超过5M';
    }

    //限制上传表格类型
    $file_type = $_FILES['myfile']['type'];
    //application/vnd.ms-excel  为xls文件类型
    //application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  为xlsx文件类型
    $type = 0;
    if ($file_type == 'application/vnd.ms-excel') {
        $type = 1;
    } elseif ($file_type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
        $type = 2;
    } else {
        $back = array(
            'message' => 'error',
            'date' => '上传失败,只能上传xls或xlsx格式的Excel文件'
        );
        echo json_encode($back);
//        echo "<script>alert('上传失败,只能上传xls或xlsx格式的Excel文件!');history.go(-1)</script>";
        exit();
    }
    $_FILES['myfile']['tmp_name'] = str_replace('\\\\', '\\', $_FILES['myfile']['tmp_name']);
//        print_r($_FILES['myfile']);
    //注意,“\\\\”实际字符串就是两个\,其他两个是用来表示转义的。
    //判断表格是否上传成功
    if (is_uploaded_file($_FILES['myfile']['tmp_name'])) {
        require_once dirname(__FILE__) . '/../Classes/PHPExcel.php';
        require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php';
        if ($type == 1) {
            require_once dirname(__FILE__) . '/../Classes/PHPExcel/Reader/Excel5.php';
        } elseif ($type == 2) {
            require_once dirname(__FILE__) . '/../Classes/PHPExcel/Reader/Excel2007.php';
        }
        //以上三步加载phpExcel的类
        if ($type == 1) {
            $objReader = PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format
        } elseif ($type == 2) {
            $objReader = PHPExcel_IOFactory::createReader('Excel2007');//use excel2007 for 2007 format
        }
        //接收存在缓存中的excel表格
        $filename = $_FILES['myfile']['tmp_name'];
        $objPHPExcel = $objReader->load($filename); //$filename可以是上传的表格,或者是指定的表格
        $sheet = $objPHPExcel->getSheet(0);
        $highestRow = $sheet->getHighestRow(); // 取得总行数
        // $highestColumn = $sheet->getHighestColumn(); // 取得总列数
        //循环读取excel表格,读取一条,插入一条
        //j表示从哪一行开始读取  从第二行开始读取,因为第一行是标题不保存
        //$a表示列号
        global $back;
        if ($highestRow == 1) {
            $back = array(
                'message' => 'error',
                'date' => '不能为空'
            );
            echo json_encode($back);
            exit();
        }
        // 定义导入错误名称接受变量
        $errorName = " ";
        // 定义导入成功数量变量
        $successNum = 0;
        for ($j = 2; $j <= $highestRow; $j++) {
            // 获取excel里面数据
           //获取A(考核范围)列的值
            $HAE_Name = preg_replace('# #', '', $objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue());
           //获取B(所属部门)列的值
            $SFD_Name = preg_replace('# #', '', $objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue());
           ​​​​​​​//获取C(员工)列的值
            $SFU_Name = preg_replace('# #', '', $objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue());
           ​​​​​​​//获取D(级别名称)列的值
            $HAL_Name = preg_replace('# #', '', $objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue());
           ​​​​​​​//获取E(所属考核类别)列的值
            $HAT_Name = preg_replace('# #', '', $objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue());
            //将excel里面获取到的值转化为对应的id
            $SFD_ID = changeTo_SFD_ID($SFD_Name);
            $HUL_Level = changeTo_HAE_ID($HAE_Name);
            $SFU_ID = changeTo_SFU_ID($SFU_Name);
            $HAL_ID = changeTo_HAL_ID($HAL_Name);
            $HAT_ID = changeTo_HAT_ID($HAT_Name);
            // 判断是否为空或者非法(
            /*******************校验是否为空***************************/
            if ($HAE_Name == null || $HAE_Name == '') {
                $errorName .= '第' . $j . '考核范围不能为空';
            } else if ($SFD_Name == null || $SFD_Name == '') {
                $errorName .= '第' . $j . '所属部门不能为空';
            } else if ($SFU_Name == null || $SFU_Name == '') {
                $errorName .= '第' . $j . '员工名称不能为空';
            } else if ($HAL_Name == null || $HAL_Name == '') {
                $errorName .= '第' . $j . '级别名称不能为空';
            } else if ($HAT_Name == null || $HAT_Name == '') {
                $errorName .= '第' . $j . '所属考核类别不能为空';
                /****************校验是否非法******************************/
            } else if ($SFD_ID == null || $SFD_ID == '') {
                $errorName .= '第' . $j . '行"所属部门"列数据无效';
            } else if ($HUL_Level == null || $HUL_Level == '') {
                $errorName .= '第' . $j . '行"考核范围"列数据无效';
            } else if ($SFU_ID == null || $SFU_ID == '') {
                $errorName .= '第' . $j . '行"员工名称"列数据无效';
            } else if ($HAL_ID == null || $HAL_ID == '') {
                $errorName .= '第' . $j . '行"级别名称"列数据无效';
            } else if ($HAT_ID == null || $HAT_ID == '') {
                $errorName .= '第' . $j . '行"所属考核类别"列数据无效';
            } else {
                // 插入数据库之前判断数据库是否存在该人员,如有则删除更新
                if (judgeUser($SFU_ID)) {
                    delete_db1("HR_AssessUserLevel", array('SFU_ID' => $SFU_ID));
                }
                // 插入数据
                $HUL_ID = create_ID('HR_AssessUserLevel');
                $HR_AssessUserLevel = array(
                    'HUL_ID' => $HUL_ID,
                    'SFU_ID' => $SFU_ID,
                    'SFD_ID' => $SFD_ID,
                    'HAL_ID' => $HAL_ID,
                    'HAT_ID' => $HAT_ID,
                    'HUL_Type' => 'BKH', //该模块默认为类型BKH
                    'HUL_Level' => $HUL_Level,
                );
                insert_db1('HR_AssessUserLevel', $HR_AssessUserLevel);
                // 返回导入成功的数量与相关错误
                $successNum++;
            }
        }    
         // 封装返回结果
            if ($successNum == 0) {
                $back = array(
                    'message' => 'fail',
                    'date' => '导入错误: ' . $errorName,
                );
            } else {
                $back = array(
                    'message' => 'success',
                    'date' => '成功导入' . $successNum . '条数据  ' . $errorName
                );
            }
          echo json_encode($back);
        }

其中changeTo_XXX_ID(),delete_db1(),insert_db1(),为自己业务封装的方法

附:

(1) function insert_db1($table, $data, $replace = false)
{
    global $mssql_connection;
    if (!$mssql_connection) {
        $mssql_connection = open_mssqlconn();
    }
    $keysql = $valsql = '';
    foreach ($data as $key => $val) {
        $keysql .= empty($keysql) ? $key : ", $key";
        if ($val == '') {
//            echo 'aaa ';
            $valsql .= empty($valsql) ? "null" : ", null";
        } else {
//            echo 'ccc ';
            $valsql .= empty($valsql) ? "'$val'" : ", '$val'";
        }
    }
    $method = $replace ? 'REPLACE' : 'INSERT';
    $sql = "$method INTO $table ($keysql) VALUES ($valsql)";
    $sql = stripslashes($sql);  //去除特殊字符串前面的反斜杠
    $sql = iconv("utf-8", "gbk", $sql);   //PHP使用UTF-8编码。SQL Server 2008使用默认的GBK编码  在执行查询语句之前将查询语句及所要插入的数据转化为GBK编码。
//    $sql="insert into $table (PMP_ID) values ('002')";
//    echo $sql.'</br>';
//    sqlsrv_query($mssql_connection,$sql);
    $cursor = sqlsrv_query($mssql_connection, $sql);
    return sqlsrv_rows_affected($cursor);
}

(2)
​​​​​​​function delete_db1($table, $where)
{
    global $mssql_connection;
    if (!$mssql_connection) {
        $mssql_connection = open_mssqlconn();
    }
    $wheresql = '';
    foreach ($where as $key => $val) {
        $wheresql .= empty($wheresql) ? " $key = '$val' " : " AND $key = '$val'";
    }
    $sql = "DELETE FROM $table WHERE $wheresql";
    $cursor = sqlsrv_query($mssql_connection, $sql);
    return sqlsrv_rows_affected($cursor);
}
(3) 数据库连接:
$mssql_connection = '';
function open_mssqlconn()
{
    global $mssql_connection;

    $MSSQL_SERVER = "xxxx";

    $connectionInfo = array("Database" => "xxx", "UID" => "sa", "PWD" => "xxx");

    if (!$mssql_connection) {
        $mssql_link = sqlsrv_connect($MSSQL_SERVER, $connectionInfo);
        if (!$mssql_link) {
            echo "Could not connect.\n";
            die(print_r(sqlsrv_errors(), true));
        }
        return $mssql_link;
    } else {
        return $mssql_connection;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39494923/article/details/81290861