百度网盘下载链接(永久有效): https://pan.baidu.com/s/1NNC9ueOl3OOwuXFGXUJsRg
ps:都是给予layui 2.5.5版本
使用方法:
前端
1:在对应页面得js中 配置以下属性
/**excel导入插件必带的自定义的参数*/var TOOL_EXCEL_FIELD = [{field:"name",condition:["notNull","lessThan11"],title:"账号"},{field:"password",condition:["notNull","lessThan18"],title:"密码"},{field:"nickName",condition:["notNull","lessThan10"],title:"名称"},{field:"sex",condition:["notNull","lessThan1"],title:"性别"},{field:"phone",condition:["notNull","phoneNumber"],title:"电话"},{field:"email",condition:["notNull","email"],title:"邮件"},{field:"roleName",condition:["notNull","lessThan100"],title:"角色"},{field:"type",condition:["notNull","lessThan100"],title:"类型"},{field:"description",condition:["notNull","lessThan100"],title:"描述"},{field:"status",condition:["notNull","lessThan100"],title:"状态"}];var TOOL_EXCEL_CHECK_URL = "/user/excelInput";//后台检查数据是否合格var TOOL_EXCEL_BATCHADD_URL = "user/batchAdd";//后台批量新增的方法var TOOL_EXCEL_INSTANCE_FILE = "/uploadfiles/excel/用户导入示例.xlsx";//下载模板var TOOL_EXCEL_EXPORT_URL = "/user/findByPage/dataGrid";//导出的查询方法var TOOL_EXCEL_EXPORT_NAME = "用户表";//导出的文件名称/**--------------------*///响应事件var active = {exportExcel: function () {//导出inletExportExcel();}, importExcel: function () {//导入inletImportExcel();}};//注册点击事件$('.demoTable .layui-btn').on('click', function () {var type = $(this).data('type');active[type] ? active[type].call(this) : '';});
2:在对应的页面中引入”myExcelTool.js”与”md5.js”,”md5.js”是用于导入的excel中含”password”字段将自动进行加密
3:在对应的html页面中写入以下html语句
<button type="button" class="layui-btn layui-btn-sm " data-type="importExcel"><img src="../../images/importExcel.png"> 导入</button><button type="button" class="layui-btn layui-btn-sm " data-type="exportExcel"><img src="../../images/exportExcel.png"> 导出</button><%--excel插件必带div--%><div id="showExcelData" style="height: 1px"><div class="layui-tab"><ul class="layui-tab-title" id="showExcelData_head"></ul><div class="layui-tab-content" id="showExcelData_body" style="overflow-x:hidden;overflow-y:hidden;"></div></div></div>
后端
1:pom.xml的jar配置请直接参考项目
1.1web.xml配置请直接参考项目
2:对应的实体类
2.1需要导入的实体类必须将所有的参数直接写出,不能用父类继承代替
2.2需要两个构造器 第一个无关紧要 第二个用于控制层设置参数
public class User{private String password;//密码private String nickName;//昵称 张三\李四private String sex;//性别private String phone;//联系电话private String email;//邮箱private String headPortrait;//头像private Role role;//角色private String type;//类型private List<Attachment> attachment;//附件/**为了满足表格筛选插件与excel导入不过于麻烦,因此加上此参数,小小的冗余更加方便*/private String roleName;//角色名称//两个构造器public User() {}//用户辅助excel导入:快捷的设置好参数public User(String name, String password, String nickName, String sex, String phone, String email, String roleName, String type, String description, String status) {this.password = password;this.roleName = roleName;this.type = type;super.setDescription(description);super.setName(name);super.setStatus(status);this.nickName = nickName;this.sex = sex;this.phone = phone;this.email = email;}get()...set()...}
3:控制层必须继承公共的控制层
3.1在控制层的父类需要引入”ExcelUtil.java”帮助类
/*** 控制层的父类,综合各大控制层的增啥改查基础方法统一实现*/public abstract class AbsSuperController {//设置excel必要的方法(负责将原始数据装入指定对象中)public abstract Object toolExcel_packagParam(List<String> listParam);/*** 插件:excel预览** @param toolExcelListTemp:因为list集合与文件上传有冲突,所以改为string类型* @param file:excel本体* @param request* @return*/@RequestMapping("excelInput")@ResponseBodypublic Back excelInput(String toolExcelListTemp, MultipartFile file, HttpServletRequest request) {List<ToolExcel> toolExcelList = getToolExcelList(toolExcelListTemp);System.out.println("接收的对象:" + toolExcelList);System.out.println("接收的文件:" + file);System.out.println(file.getOriginalFilename() + ":" + file.getSize());Back back = new Back();MultipartFile excl = file;if (request instanceof MultipartHttpServletRequest) {//说明文件不为空if (!excl.isEmpty()) {try {String fileName = excl.getOriginalFilename();//转化为流的形式InputStream is = excl.getInputStream();List<Back> excelRead = getExcelRead(fileName, is, true);//过滤第一行///以下参数将是最终返回参数////Boolean signFull_inner = true, signFull = true;//检查是否合格List<Back> backList = new ArrayList<>();//将excel处理完的数据装入集合/////////////////////////////for (int sheetNum = 0; sheetNum < excelRead.size(); sheetNum++) {String sheetName = excelRead.get(sheetNum).getMsg();//取出名字System.out.println("正在解析:" + sheetName);List<Row> list = excelRead.get(sheetNum).getExcelSheetList();//取出名字对应的excelList<Back> backList_inner = new ArrayList<>();//将excel数据装入集合signFull_inner = true;//每次循环前重置内循环的错误标记//首先是读取行 也就是一行一行读,然后在取到列,遍历行里面的行,根据行得到列的值for (Row row : list) {List<String> excelValue = new ArrayList<>();for (int i = 0; i < toolExcelList.size(); i++) {excelValue.add(ExcelUtil.getValue(row.getCell(i)));}Back back_1 = new Back(0, " ", null);//不适用new的话没法让集合装入(虽然会加大对内存的消耗,但是java垃圾销毁机制将在for循环结束清楚这些内存)List<Object> errorList = new ArrayList<>();//每行对应的错误下标集合for (int i = 0; i < excelValue.size(); i++) {if (toolExcelList.get(i).getCondition() != null && toolExcelList.get(i).getCondition().size() > 0) {//存在条件int tempContainLessThan = isContainLessThan(toolExcelList.get(i).getCondition());if (toolExcelList.get(i).getCondition().indexOf("notNull") >= 0 && "".equals(excelValue.get(i))) {//要求本字段不能为空errorList.add(i + 1);//标记本行哪一个下标出现问题back_1.setCode(-6);back_1.setMsg(back_1.getMsg() + "第" + (row.getRowNum()) + "行第" + (i + 1) + "列的角色名不能为空!_");signFull_inner = false;//标记本次预览不合格}if (tempContainLessThan >= 0 && excelValue.get(i).length() > tempContainLessThan) {//要求本字段小于100个字符errorList.add(i + 1);back_1.setCode(-6);back_1.setMsg(back_1.getMsg() + "第" + (row.getRowNum()) + "行第" + (i + 1) + "中含有过长文本(最大每格字数为:"+tempContainLessThan+")_");signFull_inner = false;}if (toolExcelList.get(i).getCondition().indexOf("phoneNumber") >= 0 && isNumLegal(excelValue.get(i)) == false) {//要求本字段必须为手机号码errorList.add(i + 1);back_1.setCode(-6);back_1.setMsg(back_1.getMsg() + "第" + (row.getRowNum()) + "行第" + (i + 1) + "中号码格式不正确_");signFull_inner = false;}if (toolExcelList.get(i).getCondition().indexOf("email") >= 0 && isEmail(excelValue.get(i)) == false) {//要求本字段必须为邮箱errorList.add(i + 1);back_1.setCode(-6);back_1.setMsg(back_1.getMsg() + "第" + (row.getRowNum()) + "行第" + (i + 1) + "中邮箱格式不正确_");signFull_inner = false;}}}back_1.setData(toolExcel_packagParam(excelValue));//设置对象由子类完成back_1.setErrorList(errorList);backList_inner.add(back_1);}System.out.println("预览成功,数据规范:" + signFull_inner + "\n集合大小:" + backList_inner.size() + "\n" + backList_inner);if (signFull_inner) {backList.add(new Back(0, sheetName, backList_inner));} else {signFull = false;backList.add(new Back(1, sheetName, backList_inner));}}back.setExcelSheetList(null);back.setExcelList(backList);if (signFull) {//全部的sheet都没出现错误back.setCode(0);} else {//sheet中出现数据不规范back.setCode(1);}} catch (Exception e) {e.printStackTrace();back = new Back(-4, "上传失败,上传出现异常", file.getOriginalFilename());System.out.println("预览出现异常");}} else {System.out.println("预览失败,文件为空");back = new Back(-5, "上传失败,文件为空", file.getOriginalFilename());}}return back;}/*** 正则表达* 手机号码由11位数字组成,* 匹配格式:前三位固定格式+后8位任意数* 此方法中前三位格式有:* 13+任意数* 15+除4的任意数* 18+除1和4的任意数* 17+除9的任意数* 147*/private static boolean isNumLegal(String phone) {String regExp = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";Pattern p = Pattern.compile(regExp);Matcher m = p.matcher(phone);return m.matches();}/*** 描述:是否是邮箱.** @param str 指定的字符串* @return 是否是邮箱:是为true,否则false*/private static Boolean isEmail(String str) {Boolean isEmail = false;String expr = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})$";if (str.matches(expr)) {isEmail = true;}return isEmail;}/**判断条件中是否包含lessThan+数量这个字段*/private static int isContainLessThan(List<String> list){for (String temp : list){if (temp.indexOf("lessThan")>=0){return Integer.parseInt(temp.substring(8));}}return -1;}/*** 解析接收的excel必要的参数** @param str* @return*/public static List<ToolExcel> getToolExcelList(String str) {str = str.substring(1, str.length() - 2).replaceAll(" +", "");System.out.println(str);String[] strs = str.split("}");List<ToolExcel> toolExcelList = new ArrayList<>();for (int i = 0; i < strs.length; i++) {ToolExcel toolExcel = new ToolExcel();if (strs[i].indexOf("\"field\":\"") >= 0) {toolExcel.setField(strs[i].substring(strs[i].indexOf("\"field\":\"") + 9, strs[i].indexOf("\",\"", strs[i].indexOf("\"field\":\""))));}if (strs[i].indexOf("\"title\":\"") >= 0) {toolExcel.setTitle(strs[i].substring(strs[i].indexOf("\"title\":\"") + 9, strs[i].length() - 1));}if (strs[i].indexOf("\"condition\":[\"") >= 0) {toolExcel.setCondition(Arrays.asList(strs[i].substring(strs[i].indexOf("\"condition\":[\"") + 13, strs[i].indexOf("],\"", strs[i].indexOf("\"condition\":[\""))).replaceAll("\"+", "").split(",")));}toolExcelList.add(toolExcel);}return toolExcelList;}/*** 获取解析文件行数据* @param fileName : 文件地址* @param isTitle : 是否过滤第一行解析* @return* @throws Exception*/public static List<Back> getExcelRead(String fileName, InputStream is, boolean isTitle) throws Exception{try {List<Back> backList = new ArrayList<>();//判断其兼容版本 调用了判断版本的方法Workbook workbook = getWorkbook(fileName,is);for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {Sheet sheet = workbook.getSheetAt(sheetNum);int count = 0;List<Row> list = new ArrayList<Row>();for (Row row : sheet) {// 跳过第一行的目录if (count == 0 && isTitle) {count++;continue;}list.add(row);}backList.add(new Back(sheet.getSheetName(),list));}System.out.println("excel共解析出:"+backList.size());return backList;} catch (Exception e) {throw e;}}/**判断版本的方法*/public static Workbook getWorkbook(String fileName, InputStream is) throws Exception{Workbook workbook = null;try {/** 判断文件的类型,是2003还是2007 */boolean isExcel2003 = true;if (WDWUtil.isExcel2007(fileName)) {isExcel2003 = false;}if (isExcel2003) {workbook = new HSSFWorkbook(is);} else {workbook = new XSSFWorkbook(is);}} catch (Exception e) {throw e;}return workbook;}/**得到celL值的方法:*/public static String getValue(Cell cell){if (cell == null || cell.equals("")){return String.valueOf("");}else {switch (cell.getCellTypeEnum()) {case BOOLEAN:return String.valueOf(cell.getBooleanCellValue());case NUMERIC:double value = cell.getNumericCellValue();return new BigDecimal(value).toString();case STRING:return String.valueOf(cell.getStringCellValue());default:return String.valueOf(cell.getStringCellValue());}}}
/*** 用户管理控制层*/@Controller@RequestMapping("user")public class UserController extends AbsSuperController implements IUser {//用于导入装载属性@Overridepublic Object toolExcel_packagParam(List<String> listParam) {return new User(listParam.get(0), listParam.get(1), listParam.get(2), listParam.get(3), listParam.get(4), listParam.get(5),listParam.get(6), listParam.get(7), listParam.get(8), listParam.get(9));}}
