POI一个表格导入这实体list的工具方法
发表于:2018-12-25 10:36:51 分类:JAVA 阅读:504次
/** * 导入表格 * @param fieldNames 与表格列一一对应的属性名称 * @param requiredFieldName 必需的字段名,用以放弃无效数据 * @param ignoreFields 忽略的字段Set 读取到的实体对应字段的值将不会设备为表格的数据 * @param clazz 导入数据的类型 * @param in 导入的文件流 * @return * @throws Exception */ public List<T> importExcel2007(String[] fieldNames,String requiredFieldName,Set<String> ignoreFields, Class<T> clazz, InputStream in) throws Exception { // 声明一个工作薄 XSSFWorkbook workbook = new XSSFWorkbook(in); List<T> res = new ArrayList<>(); Iterator<Sheet> iterator = workbook.sheetIterator(); while (iterator.hasNext()) { Sheet sheet = iterator.next(); //读取当前sheet下的每一行数据 List<T> list = readRow(sheet,fieldNames,requiredFieldName,ignoreFields, clazz); res.addAll(list); } return res; } /** * 读取表格的每一行数据,封装为一个指定对象,最后返回对象list * @param sheet 表格 * @param fieldNames 与表格列一一对应的属性名称 * @param requiredFieldName 必需的字段名,用以放弃无效数据 * @param ignoreFields 忽略的字段Set 读取到的实体对应字段的值将不会设备为表格的数据 * @param clazz 导入数据的类型 * @return * @throws Exception */ private List<T> readRow(Sheet sheet,String[] fieldNames,String requiredFieldName,Set<String> ignoreFields, Class<T> clazz) throws Exception { ArrayList<T> list = new ArrayList<>(); int lastRowNum = sheet.getLastRowNum(); int requiredIndex = -1; for (int i = 0 ;i<fieldNames.length; i++) { if(requiredFieldName.equals(fieldNames[i])){ requiredIndex = i; } } if(requiredIndex < 0){ throw new RuntimeException("必需的属性名在属性数组中不存在!"); } Field[] fields = clazz.getDeclaredFields(); //跳过表头1行 for (int rowNum = 1; rowNum <= lastRowNum; rowNum++) { Row row = sheet.getRow(rowNum); boolean isBlankRow = false; if(row == null){ continue; } T o = clazz.newInstance(); for (int i = 0; i < fields.length; i++) { Cell cell = row.getCell(i); if(cell == null && i == requiredIndex){ isBlankRow = true; break; } if(cell!=null && i<fieldNames.length){ String fieldName = fieldNames[i]; //去除被忽略的字段 if(!ignoreFields.contains(fieldName)){ Field field = clazz.getDeclaredField(fieldName); Class<?> type = field.getType(); //验证必需的字段,如果没有值就丢弃该行 if (i == requiredIndex && !checkRequiredField(cell)) { isBlankRow = true; break; } String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Method method = clazz.getMethod(setMethodName,type); Object valueObj = readCellValue(cell,type); method.invoke(o, valueObj); } } } if(isBlankRow){ continue; } list.add(o); } return list; } /** * 如果当前单元格为必需字段的话,其必须有值,否则返回false * @param cell 待验证的单元格 * @return */ private boolean checkRequiredField(Cell cell) { cell.setCellType(CellType.STRING); Object v = cell.getStringCellValue(); if (v == null || StringUtils.isBlank(v.toString())) { return false; } return true; } /** * 读取单元格的值,并按对象类型转换成对象需要类型 * @param cell 当前单元格 * @param type 对象类型 (仅支持Integer,Double,Date类型的明确转换,其它类型将以String类型返回) * @return */ private Object readCellValue(Cell cell,Class type) { Object valueObj; try { if (type.equals(Integer.class)) { cell.setCellType(CellType.NUMERIC); valueObj = (int)cell.getNumericCellValue(); } else if (type.equals(Double.class)) { cell.setCellType(CellType.NUMERIC); valueObj = cell.getNumericCellValue(); } else if (type.equals(Date.class)) { cell.setCellType(CellType.NUMERIC); valueObj = cell.getDateCellValue(); } else { cell.setCellType(CellType.STRING); valueObj = cell.getStringCellValue(); } } catch (Exception e) { throw new RuntimeException("读取数据出错!"); } return valueObj; }
关键词:poi,导入,表格