EXCEL文件导入到数据库,是一种常见的文件导入格式。
本文实现的EXCEL文件解析方法,优点是适合任意格式的EXCEL文件,缺点是每一张表单都需要配置对应的导入规则,在字段数量多时,配置导入规则就尴尬了,好在也只需要配置一遍。
先看效果,以下两张图是我测试的EXCEL文件,其中第二张图中,有5个工作表。这两个表单字段也会不定期变动,这就需要重新修改导入规则。(对于字段变动的问题,用到的是表单引擎技术,这里就不进行说明了)
先看导入规则表字段:
| 字段名称 | 中文名称 | 说明 |
| ID | 主键 | |
| BIAODANYUID | 表单域ID | 导入表的字段名称;name,sex |
| BIAODANYUMINGCHEN | 表单域名称 | 导入表的字段中文名;姓名,性别 |
| EXCELLIEHAO | EXCEL列号 | 姓名所在的列,B |
| EXCELHANGHAO | EXCEL行号 | 姓名所在的行,2 |
| SHIFUBITIANJIAOYAN | 是否必填 | 字段必填校验 |
| SHIFUCHONGFUJIAOYAN | 是否唯一 | 字段唯一性校验 |
| SHUJULEIXING | 数据类型 | 日期类型,数值类型,字典类型,图片类型 |
| SHUJUGESHI | 数据格式 | 日期的格式yyyy-MM-dd,数值的格式#.0000 |
下面开始导入EXCEL文件了
1 JSP页面上传文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Excel导入</title>
<style type="text/css">
.table td, .table th {
border: 1px solid #cad9ea;
padding: 0 1em 0;
}
.table tr {
height: 18px;
}
#loading{
position:fixed;
_position:absolute;
top:40%;
left:50%;
width:120px;
height:120px;
overflow:hidden;
background:url(${root!}/static/img/importExcel/1.gif) no-repeat;
z-index:10;
display:none;
}
</style>
</head>
<body>
<form id="importForm" method="post" action=""
enctype="multipart/form-data">
<table width="90%" class="table" style="margin-top: 5px;">
<tr>
<td style="align: center;"><input id="files" name="files" type="file" multiple="multiple" class="file "></td>
</tr>
<tr>
<td style="text-align: center;">
<div style="height: 20px;">文件只限于xls,xlsx格式</div>
<div style="height: 20px;">上传文件最大数量:${excelNumber!}</div>
<div style="height: 20px;">上传文件总大小:${excelSize!}M</div>
</td>
</tr>
</table>
</form>
<div id="loading"></div>
<script type='text/javascript'>
$(document).ready(function () {
$('#loading').hide();//隐藏loading
});
function submit() {
var excelNumber = "${excelNumber!}";
var excelSize = "${excelSize!}";
var filepath = $("input[name='files']").val();
var extStart = filepath.lastIndexOf(".");
var ext = filepath.substring(extStart, filepath.length)
.toUpperCase();
var fileCount = document.getElementById("importForm")["files"].files.length;
if(fileCount == 0 ){
// window.alert('请选择上传文件!');
layer.msg("请选择上传文件!", {icon: 2,time:1500});
return false;
}
if (ext != ".XLS" && ext != ".XLSX") {
// alert("文件只限于xls,xlsx格式");
layer.msg("文件只限于xls,xlsx格式", {icon: 2,time:1500});
return false;
}
if (fileCount > excelNumber) {
// window.alert('文件数不能超过'+excelNumber+'个,你选择了' + fileCount + '个');
layer.msg("文件数不能超过"+excelNumber+"个,您选择了" + fileCount + "个", {icon: 2,time:1500});
return false;
}
var fileSize = 0;
var i = 0;
for (i; i < fileCount; i++) {
fileSize = fileSize + $("#files")[0].files[i].size;
}
var size = fileSize / (1024 * 1024);
if (size > excelSize) {
// alert("上传的文件大小不能超过"+excelSize+"M!");
layer.msg("上传的文件大小不能超过"+excelSize+"M!", {icon: 2,time:1500});
return false;
}
$( '#importForm').attr("action",Power.rootPath + "${url!}"+"?buttonName=确认导入&flag=end" );
$("#loading").show();//显示loading
$( '#importForm').submit();
}
</script>
</body>
</html>
2 控制层接收文件
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public String uploadFile(HttpServletRequest request,
HttpServletResponse response, ModelMap map,
@RequestParam(value = "files", required = true) MultipartFile[] files) {
String appCode = approveConstant.getProperty("app.code");
// 过滤用户所能看到的机构
String userId = "";
try {
userId = getCurrentUser().get("ID");
} catch (SessionException e1) {
e1.printStackTrace();
}
PubUserOrganizatiion userOrg = userOrganizatiionService
.getEntityByUserId(userId);
try {
String realPath = request.getRealPath("/");
Map<String, String> msg = importExcelService.importExcels(files, appCode, userOrg, "10", realPath, true, true, fal

本文介绍了一种适用于任意格式EXCEL文件解析的方法,通过配置导入规则实现数据库导入。虽然需要针对每张表单配置规则,但只需配置一次。文中展示了测试用的EXCEL文件,包括含有多个工作表的例子,并提及面对字段变动时,可以利用表单引擎技术进行调整。

507

被折叠的 条评论
为什么被折叠?



