一.前端代码
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; } }