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<S