在工作中,我们经常会遇到一些奇葩的excel格式,例如竖标题的excel
这个时候我们如果用easyExcel处理有点麻烦,所以我就自己写了一个用poi处理的工具类
首选我们定义一个自定义注解
import org.apache.commons.lang3.StringUtils; import java.lang.annotation.*; /** * 指定读取的行和列 * @date 2022-11-07 */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RecordTemplate { /** * 行号 */ int rowNo(); /** * 列号 */ int columnNo(); /** * 字段名称 */ String name() default StringUtils.EMPTY; }
用法:用在字段属性上
具体的处理
/** * 解析excel备案数据到对象 * 这里也可以反射直接给对象赋值 field.setAccessible(true); */ public static Object parseExcelToModel(Sheet sheet,Class<?> dataClass) { Field[] declaredFields = dataClass.getDeclaredFields(); //获取excel的流,前端传入 HashMap<Object, Object> resultMap = new HashMap<>(declaredFields.length); for (Field field: declaredFields) { if (field.isAnnotationPresent(RecordTemplate.class)) { RecordTemplate annotation = field.getAnnotation(RecordTemplate.class); //单元格的值 String value = readCell(sheet, annotation.rowNo(), annotation.columnNo()); //通过反射把 单元格的值 给对象属性 resultMap.put(field.getName(),value); } } return resultMap; }
/** * 根据坐标读取excel的值 * @param sheet excel * @param rowNo 行数 * @param columnNo 列数 * @return 单元格内的值 (String) */ private static String readCell(Sheet sheet,int rowNo, int columnNo){ int lastRowNum = sheet.getLastRowNum(); if (rowNo > lastRowNum){ return null; } //获取行 Row row = sheet.getRow(rowNo); //获取该行的第2列的单元格 Cell cell = row.getCell(columnNo); //设置单元格类型 DataFormatter dataFormatter = new DataFormatter(); return dataFormatter.formatCellValue(cell); }