百度网盘下载链接(永久有效): https://pan.baidu.com/s/1NNC9ueOl3OOwuXFGXUJsRg
ps:都是给予layui 2.5.5版本

使用方法:

前端

1:在对应页面得js中 配置以下属性

  1. /**excel导入插件必带的自定义的参数*/
  2. var TOOL_EXCEL_FIELD = [{
  3. field:"name",
  4. condition:["notNull","lessThan11"],
  5. title:"账号"
  6. },{
  7. field:"password",
  8. condition:["notNull","lessThan18"],
  9. title:"密码"
  10. },{
  11. field:"nickName",
  12. condition:["notNull","lessThan10"],
  13. title:"名称"
  14. },{
  15. field:"sex",
  16. condition:["notNull","lessThan1"],
  17. title:"性别"
  18. },{
  19. field:"phone",
  20. condition:["notNull","phoneNumber"],
  21. title:"电话"
  22. },{
  23. field:"email",
  24. condition:["notNull","email"],
  25. title:"邮件"
  26. },{
  27. field:"roleName",
  28. condition:["notNull","lessThan100"],
  29. title:"角色"
  30. },{
  31. field:"type",
  32. condition:["notNull","lessThan100"],
  33. title:"类型"
  34. },{
  35. field:"description",
  36. condition:["notNull","lessThan100"],
  37. title:"描述"
  38. },{
  39. field:"status",
  40. condition:["notNull","lessThan100"],
  41. title:"状态"
  42. }];
  43. var TOOL_EXCEL_CHECK_URL = "/user/excelInput";//后台检查数据是否合格
  44. var TOOL_EXCEL_BATCHADD_URL = "user/batchAdd";//后台批量新增的方法
  45. var TOOL_EXCEL_INSTANCE_FILE = "/uploadfiles/excel/用户导入示例.xlsx";//下载模板
  46. var TOOL_EXCEL_EXPORT_URL = "/user/findByPage/dataGrid";//导出的查询方法
  47. var TOOL_EXCEL_EXPORT_NAME = "用户表";//导出的文件名称
  48. /**--------------------*/
  49. //响应事件
  50. var active = {
  51. exportExcel: function () {//导出
  52. inletExportExcel();
  53. }, importExcel: function () {//导入
  54. inletImportExcel();
  55. }
  56. };
  57. //注册点击事件
  58. $('.demoTable .layui-btn').on('click', function () {
  59. var type = $(this).data('type');
  60. active[type] ? active[type].call(this) : '';
  61. });

2:在对应的页面中引入”myExcelTool.js”与”md5.js”,”md5.js”是用于导入的excel中含”password”字段将自动进行加密
3:在对应的html页面中写入以下html语句

  1. <button type="button" class="layui-btn layui-btn-sm " data-type="importExcel">
  2. <img src="../../images/importExcel.png"> 导入
  3. </button>
  4. <button type="button" class="layui-btn layui-btn-sm " data-type="exportExcel">
  5. <img src="../../images/exportExcel.png"> 导出
  6. </button>
  7. <%--excel插件必带div--%>
  8. <div id="showExcelData" style="height: 1px">
  9. <div class="layui-tab">
  10. <ul class="layui-tab-title" id="showExcelData_head">
  11. </ul>
  12. <div class="layui-tab-content" id="showExcelData_body" style="overflow-x:hidden;overflow-y:hidden;">
  13. </div>
  14. </div>
  15. </div>

后端

1:pom.xml的jar配置请直接参考项目
1.1web.xml配置请直接参考项目
2:对应的实体类
2.1需要导入的实体类必须将所有的参数直接写出,不能用父类继承代替
2.2需要两个构造器 第一个无关紧要 第二个用于控制层设置参数

  1. public class User{
  2. private String password;//密码
  3. private String nickName;//昵称 张三\李四
  4. private String sex;//性别
  5. private String phone;//联系电话
  6. private String email;//邮箱
  7. private String headPortrait;//头像
  8. private Role role;//角色
  9. private String type;//类型
  10. private List<Attachment> attachment;//附件
  11. /**为了满足表格筛选插件与excel导入不过于麻烦,因此加上此参数,小小的冗余更加方便*/
  12. private String roleName;//角色名称
  13. //两个构造器
  14. public User() {}
  15. //用户辅助excel导入:快捷的设置好参数
  16. public User(String name, String password, String nickName, String sex, String phone, String email, String roleName, String type, String description, String status) {
  17. this.password = password;
  18. this.roleName = roleName;
  19. this.type = type;
  20. super.setDescription(description);
  21. super.setName(name);
  22. super.setStatus(status);
  23. this.nickName = nickName;
  24. this.sex = sex;
  25. this.phone = phone;
  26. this.email = email;
  27. }
  28. get()...
  29. set()...
  30. }

3:控制层必须继承公共的控制层
3.1在控制层的父类需要引入”ExcelUtil.java”帮助类

  1. /**
  2. * 控制层的父类,综合各大控制层的增啥改查基础方法统一实现
  3. */
  4. public abstract class AbsSuperController {
  5. //设置excel必要的方法(负责将原始数据装入指定对象中)
  6. public abstract Object toolExcel_packagParam(List<String> listParam);
  7. /**
  8. * 插件:excel预览
  9. *
  10. * @param toolExcelListTemp:因为list集合与文件上传有冲突,所以改为string类型
  11. * @param file:excel本体
  12. * @param request
  13. * @return
  14. */
  15. @RequestMapping("excelInput")
  16. @ResponseBody
  17. public Back excelInput(String toolExcelListTemp, MultipartFile file, HttpServletRequest request) {
  18. List<ToolExcel> toolExcelList = getToolExcelList(toolExcelListTemp);
  19. System.out.println("接收的对象:" + toolExcelList);
  20. System.out.println("接收的文件:" + file);
  21. System.out.println(file.getOriginalFilename() + ":" + file.getSize());
  22. Back back = new Back();
  23. MultipartFile excl = file;
  24. if (request instanceof MultipartHttpServletRequest) {
  25. //说明文件不为空
  26. if (!excl.isEmpty()) {
  27. try {
  28. String fileName = excl.getOriginalFilename();
  29. //转化为流的形式
  30. InputStream is = excl.getInputStream();
  31. List<Back> excelRead = getExcelRead(fileName, is, true);//过滤第一行
  32. ///以下参数将是最终返回参数////
  33. Boolean signFull_inner = true, signFull = true;//检查是否合格
  34. List<Back> backList = new ArrayList<>();//将excel处理完的数据装入集合
  35. /////////////////////////////
  36. for (int sheetNum = 0; sheetNum < excelRead.size(); sheetNum++) {
  37. String sheetName = excelRead.get(sheetNum).getMsg();//取出名字
  38. System.out.println("正在解析:" + sheetName);
  39. List<Row> list = excelRead.get(sheetNum).getExcelSheetList();//取出名字对应的excel
  40. List<Back> backList_inner = new ArrayList<>();//将excel数据装入集合
  41. signFull_inner = true;//每次循环前重置内循环的错误标记
  42. //首先是读取行 也就是一行一行读,然后在取到列,遍历行里面的行,根据行得到列的值
  43. for (Row row : list) {
  44. List<String> excelValue = new ArrayList<>();
  45. for (int i = 0; i < toolExcelList.size(); i++) {
  46. excelValue.add(ExcelUtil.getValue(row.getCell(i)));
  47. }
  48. Back back_1 = new Back(0, " ", null);//不适用new的话没法让集合装入(虽然会加大对内存的消耗,但是java垃圾销毁机制将在for循环结束清楚这些内存)
  49. List<Object> errorList = new ArrayList<>();//每行对应的错误下标集合
  50. for (int i = 0; i < excelValue.size(); i++) {
  51. if (toolExcelList.get(i).getCondition() != null && toolExcelList.get(i).getCondition().size() > 0) {//存在条件
  52. int tempContainLessThan = isContainLessThan(toolExcelList.get(i).getCondition());
  53. if (toolExcelList.get(i).getCondition().indexOf("notNull") >= 0 && "".equals(excelValue.get(i))) {//要求本字段不能为空
  54. errorList.add(i + 1);//标记本行哪一个下标出现问题
  55. back_1.setCode(-6);
  56. back_1.setMsg(back_1.getMsg() + "第" + (row.getRowNum()) + "行第" + (i + 1) + "列的角色名不能为空!_");
  57. signFull_inner = false;//标记本次预览不合格
  58. }
  59. if (tempContainLessThan >= 0 && excelValue.get(i).length() > tempContainLessThan) {//要求本字段小于100个字符
  60. errorList.add(i + 1);
  61. back_1.setCode(-6);
  62. back_1.setMsg(back_1.getMsg() + "第" + (row.getRowNum()) + "行第" + (i + 1) + "中含有过长文本(最大每格字数为:"+tempContainLessThan+")_");
  63. signFull_inner = false;
  64. }
  65. if (toolExcelList.get(i).getCondition().indexOf("phoneNumber") >= 0 && isNumLegal(excelValue.get(i)) == false) {//要求本字段必须为手机号码
  66. errorList.add(i + 1);
  67. back_1.setCode(-6);
  68. back_1.setMsg(back_1.getMsg() + "第" + (row.getRowNum()) + "行第" + (i + 1) + "中号码格式不正确_");
  69. signFull_inner = false;
  70. }
  71. if (toolExcelList.get(i).getCondition().indexOf("email") >= 0 && isEmail(excelValue.get(i)) == false) {//要求本字段必须为邮箱
  72. errorList.add(i + 1);
  73. back_1.setCode(-6);
  74. back_1.setMsg(back_1.getMsg() + "第" + (row.getRowNum()) + "行第" + (i + 1) + "中邮箱格式不正确_");
  75. signFull_inner = false;
  76. }
  77. }
  78. }
  79. back_1.setData(toolExcel_packagParam(excelValue));//设置对象由子类完成
  80. back_1.setErrorList(errorList);
  81. backList_inner.add(back_1);
  82. }
  83. System.out.println("预览成功,数据规范:" + signFull_inner + "\n集合大小:" + backList_inner.size() + "\n" + backList_inner);
  84. if (signFull_inner) {
  85. backList.add(new Back(0, sheetName, backList_inner));
  86. } else {
  87. signFull = false;
  88. backList.add(new Back(1, sheetName, backList_inner));
  89. }
  90. }
  91. back.setExcelSheetList(null);
  92. back.setExcelList(backList);
  93. if (signFull) {//全部的sheet都没出现错误
  94. back.setCode(0);
  95. } else {//sheet中出现数据不规范
  96. back.setCode(1);
  97. }
  98. } catch (Exception e) {
  99. e.printStackTrace();
  100. back = new Back(-4, "上传失败,上传出现异常", file.getOriginalFilename());
  101. System.out.println("预览出现异常");
  102. }
  103. } else {
  104. System.out.println("预览失败,文件为空");
  105. back = new Back(-5, "上传失败,文件为空", file.getOriginalFilename());
  106. }
  107. }
  108. return back;
  109. }
  110. /**
  111. * 正则表达
  112. * 手机号码由11位数字组成,
  113. * 匹配格式:前三位固定格式+后8位任意数
  114. * 此方法中前三位格式有:
  115. * 13+任意数
  116. * 15+除4的任意数
  117. * 18+除1和4的任意数
  118. * 17+除9的任意数
  119. * 147
  120. */
  121. private static boolean isNumLegal(String phone) {
  122. String regExp = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";
  123. Pattern p = Pattern.compile(regExp);
  124. Matcher m = p.matcher(phone);
  125. return m.matches();
  126. }
  127. /**
  128. * 描述:是否是邮箱.
  129. *
  130. * @param str 指定的字符串
  131. * @return 是否是邮箱:是为true,否则false
  132. */
  133. private static Boolean isEmail(String str) {
  134. Boolean isEmail = false;
  135. 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})$";
  136. if (str.matches(expr)) {
  137. isEmail = true;
  138. }
  139. return isEmail;
  140. }
  141. /**判断条件中是否包含lessThan+数量这个字段*/
  142. private static int isContainLessThan(List<String> list){
  143. for (String temp : list){
  144. if (temp.indexOf("lessThan")>=0){
  145. return Integer.parseInt(temp.substring(8));
  146. }
  147. }
  148. return -1;
  149. }
  150. /**
  151. * 解析接收的excel必要的参数
  152. *
  153. * @param str
  154. * @return
  155. */
  156. public static List<ToolExcel> getToolExcelList(String str) {
  157. str = str.substring(1, str.length() - 2).replaceAll(" +", "");
  158. System.out.println(str);
  159. String[] strs = str.split("}");
  160. List<ToolExcel> toolExcelList = new ArrayList<>();
  161. for (int i = 0; i < strs.length; i++) {
  162. ToolExcel toolExcel = new ToolExcel();
  163. if (strs[i].indexOf("\"field\":\"") >= 0) {
  164. toolExcel.setField(strs[i].substring(strs[i].indexOf("\"field\":\"") + 9, strs[i].indexOf("\",\"", strs[i].indexOf("\"field\":\""))));
  165. }
  166. if (strs[i].indexOf("\"title\":\"") >= 0) {
  167. toolExcel.setTitle(strs[i].substring(strs[i].indexOf("\"title\":\"") + 9, strs[i].length() - 1));
  168. }
  169. if (strs[i].indexOf("\"condition\":[\"") >= 0) {
  170. toolExcel.setCondition(Arrays.asList(strs[i].substring(strs[i].indexOf("\"condition\":[\"") + 13, strs[i].indexOf("],\"", strs[i].indexOf("\"condition\":[\""))).replaceAll("\"+", "").split(",")));
  171. }
  172. toolExcelList.add(toolExcel);
  173. }
  174. return toolExcelList;
  175. }
  176. /**
  177. * 获取解析文件行数据
  178. * @param fileName : 文件地址
  179. * @param isTitle : 是否过滤第一行解析
  180. * @return
  181. * @throws Exception
  182. */
  183. public static List<Back> getExcelRead(String fileName, InputStream is, boolean isTitle) throws Exception{
  184. try {
  185. List<Back> backList = new ArrayList<>();
  186. //判断其兼容版本 调用了判断版本的方法
  187. Workbook workbook = getWorkbook(fileName,is);
  188. for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
  189. Sheet sheet = workbook.getSheetAt(sheetNum);
  190. int count = 0;
  191. List<Row> list = new ArrayList<Row>();
  192. for (Row row : sheet) {
  193. // 跳过第一行的目录
  194. if (count == 0 && isTitle) {
  195. count++;
  196. continue;
  197. }
  198. list.add(row);
  199. }
  200. backList.add(new Back(sheet.getSheetName(),list));
  201. }
  202. System.out.println("excel共解析出:"+backList.size());
  203. return backList;
  204. } catch (Exception e) {
  205. throw e;
  206. }
  207. }
  208. /**判断版本的方法*/
  209. public static Workbook getWorkbook(String fileName, InputStream is) throws Exception{
  210. Workbook workbook = null;
  211. try {
  212. /** 判断文件的类型,是2003还是2007 */
  213. boolean isExcel2003 = true;
  214. if (WDWUtil.isExcel2007(fileName)) {
  215. isExcel2003 = false;
  216. }
  217. if (isExcel2003) {
  218. workbook = new HSSFWorkbook(is);
  219. } else {
  220. workbook = new XSSFWorkbook(is);
  221. }
  222. } catch (Exception e) {
  223. throw e;
  224. }
  225. return workbook;
  226. }
  227. /**得到celL值的方法:*/
  228. public static String getValue(Cell cell){
  229. if (cell == null || cell.equals(""))
  230. {
  231. return String.valueOf("");
  232. }
  233. else {
  234. switch (cell.getCellTypeEnum()) {
  235. case BOOLEAN:
  236. return String.valueOf(cell.getBooleanCellValue());
  237. case NUMERIC:
  238. double value = cell.getNumericCellValue();
  239. return new BigDecimal(value).toString();
  240. case STRING:
  241. return String.valueOf(cell.getStringCellValue());
  242. default:
  243. return String.valueOf(cell.getStringCellValue());
  244. }
  245. }
  246. }
  1. /**
  2. * 用户管理控制层
  3. */
  4. @Controller
  5. @RequestMapping("user")
  6. public class UserController extends AbsSuperController implements IUser {
  7. //用于导入装载属性
  8. @Override
  9. public Object toolExcel_packagParam(List<String> listParam) {
  10. return new User(listParam.get(0), listParam.get(1), listParam.get(2), listParam.get(3), listParam.get(4), listParam.get(5),
  11. listParam.get(6), listParam.get(7), listParam.get(8), listParam.get(9));
  12. }
  13. }