需要做个导入excel数据到mysql,其实navicate工具就可以无脑导入辣,但是如果需要加些业务啥的那最好还是写代码操作了,其实很简单,还是记录下来,分享也方便自己日后直接拿来用~
开整~
当然第一步是先读到内存里啦,Apache的POI是个很好的工具,话不多少,贴代码,修改下自己需要接收excel数据的Java类即可~
1.将相应maven依赖添加到pom.xml文件中:
<!-- poi:07版之前的二进制格式 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.0</version> </dependency> <!-- poi-ooxml:07版之后的OpenXML格式 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.0</version> </dependency>2.新建对应excel数据的接收类,这里不再赘述辽
3.util 工具类(根据需要修改,只是操作excel部分通用)
package com.pacific.rsp.phone.util; import com.pacific.rsp.phone.exception.PhoneException; import com.pacific.rsp.phone.model.request.EmpParam; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFCell; import org.springframework.web.multipart.MultipartFile; import java.lang.reflect.Field; import java.text.DecimalFormat; import java.util.*; /** * @author: Hason * @Description:Excel上传: 针对单元格数据类型转换数据格式 * @Date: Created in 2019/5/24 14:14 */ public class ExcelUtils { public static List<EmpParam> readPhoneUserImportScores(MultipartFile file) throws Exception { if(file == null || file.getSize() == 0) return null; List<EmpParam> datas = new ArrayList<EmpParam>(); // 文件名 String fileName = file.getOriginalFilename(); if (fileName.endsWith(".xlsx")||fileName.endsWith(".xls")) { // 获取Excel文件对象 Workbook wb = WorkbookFactory.create(file.getInputStream()); // 获取文件指定工作表,默认第一个 Sheet sheet = wb.getSheetAt(0); // 遍历行数(行记录,从0开始,首行记录数+1) w: for (int i = 2; i < sheet.getLastRowNum() + 1; i++) { // 每一行对应一个list List<Object> list = new ArrayList<Object>(); // 创建一个行对象 Row row = sheet.getRow(i); if (row == null || row.getLastCellNum() == -1) { break w; } if(!CheckRowNull(row)){ continue; } //表格列名校验开始 List checkTitleList = new ArrayList<Object>(); Row checkTitleListrow = sheet.getRow(1); for (int j = 0; j < checkTitleListrow.getLastCellNum(); j++) { // 为每一个字段创建一个单元格对象 Cell checkTitleListcell = checkTitleListrow.getCell((short) (j)); if (checkTitleListcell == null || "".equals(checkTitleListcell)) { checkTitleList.add(""); continue ; } // 获取cell数据 Object data = getCellValue(checkTitleListcell); checkTitleList.add(data); } if(!checkTitleList.get(0).equals("姓名") || !checkTitleList.get(1).equals("工号") || !checkTitleList.get(2).equals("手机号") )throw new PhoneException("表格列名称错误,请选择正确的模板导入!","PH00001"); // 遍历一行中的每个字段 for (int j = 0; j < row.getLastCellNum(); j++) { // 为每一个字段创建一个单元格对象 Cell cell = row.getCell((short) (j)); if (cell == null || "".equals(cell)) { list.add(""); continue; } // 获取cell数据 Object data = getCellValue(cell); list.add(data); } //此部分用自己的实体类接收数据 // EmpParam param =new EmpParam(); // param.setName(list.get(0).toString()); // param.setEmpNo(list.get(1).toString()); // param.setMobile(list.get(2).toString()); // param.setChannel(list.get(3).toString()); datas.add(param); } wb.close(); } return datas; } /** * EXCEL中的CELL值转换 * * @param cell * @return */ public static Object getCellValue(Cell cell) { Object result = null; switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_NUMERIC: // 数字类型,日期类型 result = dealNum(cell); break; case XSSFCell.CELL_TYPE_STRING: // 字符串类型 result = cell.getStringCellValue(); result = dealStr(result.toString()); break; case XSSFCell.CELL_TYPE_FORMULA: // 公式 result = cell.getCellFormula(); break; default: result = String.valueOf(cell.getStringCellValue()); break; } return result; } /** * 处理数值类型 * * @param cell * @return */ public static Object dealNum(Cell cell) { Object str = ""; if (HSSFDateUtil.isCellDateFormatted(cell)) { Date cellDate = cell.getDateCellValue(); //str = TimeUtils.formatAll(cellDate); return cellDate; } else { str = new DecimalFormat("#.##").format(cell.getNumericCellValue()); } return str; } /** * * 根据后缀判断是否为 Excel 文件,后缀匹配xls和xlsx * * @param pathname * @return * */ public static boolean isExcel(String pathname) { if (pathname == null) { return false; } return pathname.endsWith(".xls") || pathname.endsWith(".xlsx"); } /** * 处理字符串 * * @param str * @return */ public static String dealStr(String str) { if (str.trim().equals("") || str.trim().length() < 0) { str = ""; } return str; } /** * 检查改行是不是全空 * @param row * @return */ public static boolean CheckRowNull(Row row){ boolean flag = false; Iterator<Cell> iterator = row.cellIterator(); while(iterator.hasNext()){ Cell cell = iterator.next(); if(cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK && !cell.equals("") ) flag = true; } return flag; } public static boolean checkNumber(String number){ // String regex = "^(\\d|[1-9]\\d|100)(\\.\\d{1,1})?$"; String regex = "^(((\\d|[1-9]\\d)(\\.\\d{1,2})?)|100|100.0|100.00)$"; if(number.matches(regex)){ return true; }else { return false; } } /** * 判断字符串是否为数字 * @param str * @return */ public static boolean isNumber(String str){ return str.matches("-?[0-9]+.*[0-9]*"); } public static boolean checkYear(String year){ String regex = "[1-9]+\\d{3}\\-(?:0[1-9]|1[0-2])"; StringBuffer str = new StringBuffer(year); str.insert(4, "-"); String s = str.toString(); if(s.matches(regex)){ return true; }else { return false; } } public static boolean isDone(String number1,String number2){ Integer integer1 = Integer.valueOf(number1); Integer integer2 = Integer.valueOf(number2); if(integer1<integer2){ return true; }else { return false; } } /** * 获取利用反射获取类里面的值和名称 * * @param obj * @return * @throws IllegalAccessException */ public static Map<String, Object> objectToMap(Object obj) throws IllegalAccessException { Map<String, Object> map = new HashMap<>(); Class<?> clazz = obj.getClass(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); String fieldName = field.getName(); Object value = field.get(obj); map.put(fieldName, value); } return map; } }
听说有大神写了个开源项目叫EasyExcel,还没来得及看,应该很强大,有兴趣可以看下~
GitHub:https://github.com/alibaba/easyexcel
