Easypoi map方式导入数据 ,List<Map<String, String>> 日期项数据为空(null)解决办法

目录

    • 前言
    • 解决办法

前言

在使用easypoi map的方式解析excel文件,若文件中的某列数据格式是日期类型,那么它这个工具是读取不到,因为它的源码读取到某列为日期格式,数据必须为字符串类型,它才会处理

switch (cell.getCellType()) {
                case STRING:
                    result = cell.getRichStringCellValue() == null ? ""
                            : cell.getRichStringCellValue().getString();
                    break;
                case NUMERIC:
                    if (DateUtil.isCellDateFormatted(cell)) {
                        if ("class java.lang.String".equals(classFullName)) {
                            result = formateDate(entity, cell.getDateCellValue());
                        }
                    } else {
                        result = readNumericCell(cell);
                    }
                    break;
                case BOOLEAN:
                    result = Boolean.toString(cell.getBooleanCellValue());
                    break;
                case BLANK:
                    break;
                case ERROR:
                    break;
                case FORMULA:
                    try {
                        result = readNumericCell(cell);
                    } catch (Exception e1) {
                        try {
                            result = cell.getRichStringCellValue() == null ? ""
                                    : cell.getRichStringCellValue().getString();
                        } catch (Exception e2) {
                            throw new RuntimeException("获取公式类型的单元格失败", e2);
                        }
                    }
                    break;
                default:
                    break;
            }

解决办法

来个简单粗暴的,既然源码无法满足,那就直接扩展它的源码,在它 case NUMERIC 下加个任意类型都可以进去的判断方法,在项目main java包路径下定义一个跟源码一样的路径,一样的类,若那位大佬有更好的办法,还望留言指导一下呢

if("class java.lang.Object".equals(classFullName)){
 	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
 	return format.format(cell.getDateCellValue());
}

main路径 java 路径下定义包路径

cn.afterturn.easypoi.excel.imports

处理类:

/**
 * Copyright 2013-2015 JueYue ([email protected])
 * 

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *

* http://www.apache.org/licenses/LICENSE-2.0 *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package cn.afterturn.easypoi.excel.imports; import cn.afterturn.easypoi.excel.entity.params.ExcelImportEntity; import cn.afterturn.easypoi.excel.entity.sax.SaxReadCellEntity; import cn.afterturn.easypoi.exception.excel.ExcelImportException; import cn.afterturn.easypoi.exception.excel.enums.ExcelImportEnum; import cn.afterturn.easypoi.handler.inter.IExcelDataHandler; import cn.afterturn.easypoi.handler.inter.IExcelDictHandler; import cn.afterturn.easypoi.util.PoiPublicUtil; import cn.afterturn.easypoi.util.PoiReflectorUtil; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.DateUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.math.BigDecimal; import java.sql.Time; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.ZoneId; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; /** * Cell 取值服务 * 判断类型处理数据 1.判断Excel中的类型 2.根据replace替换值 3.handler处理数据 4.判断返回类型转化数据返回 * * @author JueYue * 2014年6月26日 下午10:42:28 */ public class CellValueService { private static final Logger LOGGER = LoggerFactory.getLogger(CellValueService.class); private List<String> handlerList = null; /** * 获取单元格内的值 * * @param cell * @param entity * @return */ private Object getCellValue(String classFullName, Cell cell, ExcelImportEntity entity) { if (cell == null) { return ""; } Object result = null; if ("class java.util.Date".equals(classFullName) || "class java.sql.Date".equals(classFullName) || ("class java.sql.Time").equals(classFullName) || ("class java.time.Instant").equals(classFullName) || ("class java.time.LocalDate").equals(classFullName) || ("class java.time.LocalDateTime").equals(classFullName) || ("class java.sql.Timestamp").equals(classFullName)) { //FIX: 单元格yyyyMMdd数字时候使用 cell.getDateCellValue() 解析出的日期错误 if (CellType.NUMERIC == cell.getCellType() && DateUtil.isCellDateFormatted(cell)) { result = DateUtil.getJavaDate(cell.getNumericCellValue()); } else { String val = ""; try { val = cell.getStringCellValue(); } catch (Exception e) { return null; } result = getDateData(entity, val); if (result == null) { return null; } } if (("class java.time.Instant").equals(classFullName)) { result = ((Date) result).toInstant(); } else if (("class java.time.LocalDate").equals(classFullName)) { result = ((Date) result).toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); } else if (("class java.time.LocalDateTime").equals(classFullName)) { result = ((Date) result).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); } else if (("class java.time.OffsetDateTime").equals(classFullName)) { result = ((Date) result).toInstant().atZone(ZoneId.systemDefault()).toOffsetDateTime(); } else if (("class java.time.ZonedDateTime").equals(classFullName)) { result = ((Date) result).toInstant().atZone(ZoneId.systemDefault()); } else if (("class java.sql.Date").equals(classFullName)) { result = new java.sql.Date(((Date) result).getTime()); } else if (("class java.sql.Time").equals(classFullName)) { result = new Time(((Date) result).getTime()); } else if (("class java.sql.Timestamp").equals(classFullName)) { result = new Timestamp(((Date) result).getTime()); } } else { switch (cell.getCellType()) { case STRING: result = cell.getRichStringCellValue() == null ? "" : cell.getRichStringCellValue().getString(); break; case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { if ("class java.lang.String".equals(classFullName)) { result = formateDate(entity, cell.getDateCellValue()); } if("class java.lang.Object".equals(classFullName)){ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); return format.format(cell.getDateCellValue()); } } else { result = readNumericCell(cell); } break; case BOOLEAN: result = Boolean.toString(cell.getBooleanCellValue()); break; case BLANK: break; case ERROR: break; case FORMULA: try { result = readNumericCell(cell); } catch (Exception e1) { try { result = cell.getRichStringCellValue() == null ? "" : cell.getRichStringCellValue().getString(); } catch (Exception e2) { throw new RuntimeException("获取公式类型的单元格失败", e2); } } break; default: break; } } return result; } private Object readNumericCell(Cell cell) { Object result = null; double value = cell.getNumericCellValue(); if (((int) value) == value) { result = (int) value; } else { result = value; } return result; } /** * 获取日期类型数据 * * @param entity * @param value * @return * @author JueYue * 2013年11月26日 */ private Date getDateData(ExcelImportEntity entity, String value) { if (StringUtils.isNotEmpty(entity.getFormat()) && StringUtils.isNotEmpty(value)) { SimpleDateFormat format = new SimpleDateFormat(entity.getFormat()); try { return format.parse(value); } catch (ParseException e) { try { return DateUtil.getJavaDate(Double.parseDouble(value)); } catch (NumberFormatException ex) { LOGGER.error("时间格式化失败,格式化:{},值:{}", entity.getFormat(), value); throw new ExcelImportException(ExcelImportEnum.GET_VALUE_ERROR); } } } return null; } private String formateDate(ExcelImportEntity entity, Date value) { if (StringUtils.isNotEmpty(entity.getFormat()) && value != null) { SimpleDateFormat format = new SimpleDateFormat(entity.getFormat()); return format.format(value); } return null; } /** * 获取cell的值 * * @param object * @param cell * @param excelParams * @param titleString * @param dictHandler */ public Object getValue(IExcelDataHandler<?> dataHandler, Object object, Object cell, Map<String, ExcelImportEntity> excelParams, String titleString, IExcelDictHandler dictHandler) throws Exception { ExcelImportEntity entity = excelParams.get(titleString); String classFullName = "class java.lang.Object"; Class clazz = null; if (!(object instanceof Map)) { Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 ? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); Type[] ts = setMethod.getGenericParameterTypes(); classFullName = ts[0].toString(); clazz = (Class) ts[0]; } Object result = null; if(cell instanceof Cell){ result = getCellValue(classFullName, (Cell) cell, entity); }else{ result = cell; } if (entity != null) { result = handlerSuffix(entity.getSuffix(), result); result = replaceValue(entity.getReplace(), result); result = replaceValue(entity.getReplace(), result); if (dictHandler != null && StringUtils.isNoneBlank(entity.getDict())) { result = dictHandler.toValue(entity.getDict(), object, entity.getName(), result); } } result = handlerValue(dataHandler, object, result, titleString); return getValueByType(classFullName, result, entity, clazz); } /** * 获取cell值 * * @param dataHandler * @param object * @param cellEntity * @param excelParams * @param titleString * @return */ public Object getValue(IExcelDataHandler<?> dataHandler, Object object, SaxReadCellEntity cellEntity, Map<String, ExcelImportEntity> excelParams, String titleString) { ExcelImportEntity entity = excelParams.get(titleString); Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 ? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); Type[] ts = setMethod.getGenericParameterTypes(); String classFullName = ts[0].toString(); Object result = cellEntity.getValue(); result = handlerSuffix(entity.getSuffix(), result); result = replaceValue(entity.getReplace(), result); result = handlerValue(dataHandler, object, result, titleString); return getValueByType(classFullName, result, entity, (Class) ts[0]); } /** * 把后缀删除掉 * * @param result * @param suffix * @return */ private Object handlerSuffix(String suffix, Object result) { if (StringUtils.isNotEmpty(suffix) && result != null && result.toString().endsWith(suffix)) { String temp = result.toString(); return temp.substring(0, temp.length() - suffix.length()); } return result; } /** * 根据返回类型获取返回值 * * @param classFullName * @param result * @param entity * @param clazz * @return */ private Object getValueByType(String classFullName, Object result, ExcelImportEntity entity, Class clazz) { try { //过滤空和空字符串,如果基本类型null会在上层抛出,这里就不处理了 if (result == null || StringUtils.isBlank(result.toString())) { return null; } if ("class java.util.Date".equals(classFullName) && result instanceof String) { return DateUtils.parseDate(result.toString(), entity.getFormat()); } if ("class java.lang.Boolean".equals(classFullName) || "boolean".equals(classFullName)) { return Boolean.valueOf(String.valueOf(result)); } if ("class java.lang.Double".equals(classFullName) || "double".equals(classFullName)) { return Double.valueOf(String.valueOf(result)); } if ("class java.lang.Long".equals(classFullName) || "long".equals(classFullName)) { try { return Long.valueOf(String.valueOf(result)); } catch (Exception e) { //格式错误的时候,就用double,然后获取Int值 return Double.valueOf(String.valueOf(result)).longValue(); } } if ("class java.lang.Float".equals(classFullName) || "float".equals(classFullName)) { return Float.valueOf(String.valueOf(result)); } if ("class java.lang.Integer".equals(classFullName) || "int".equals(classFullName)) { try { return Integer.valueOf(String.valueOf(result)); } catch (Exception e) { //格式错误的时候,就用double,然后获取Int值 return Double.valueOf(String.valueOf(result)).intValue(); } } if ("class java.math.BigDecimal".equals(classFullName)) { return new BigDecimal(String.valueOf(result)); } if ("class java.lang.String".equals(classFullName)) { //针对String 类型,但是Excel获取的数据却不是String,比如Double类型,防止科学计数法 if (result instanceof String) { return result; } // double类型防止科学计数法 if (result instanceof Double) { return PoiPublicUtil.doubleToString((Double) result); } return String.valueOf(result); } if (clazz != null && clazz.isEnum()) { if (StringUtils.isNotEmpty(entity.getEnumImportMethod())) { return PoiReflectorUtil.fromCache(clazz).execEnumStaticMethod(entity.getEnumImportMethod(), result); } else { return Enum.valueOf(clazz, result.toString()); } } return result; } catch (Exception e) { LOGGER.error(e.getMessage(), e); throw new ExcelImportException(ExcelImportEnum.GET_VALUE_ERROR); } } /** * 调用处理接口处理值 * * @param dataHandler * @param object * @param result * @param titleString * @return */ @SuppressWarnings({"unchecked", "rawtypes"}) private Object handlerValue(IExcelDataHandler dataHandler, Object object, Object result, String titleString) { if (dataHandler == null || dataHandler.getNeedHandlerFields() == null || dataHandler.getNeedHandlerFields().length == 0) { return result; } if (handlerList == null) { handlerList = Arrays.asList(dataHandler.getNeedHandlerFields()); } if (handlerList.contains(titleString)) { return dataHandler.importHandler(object, titleString, result); } return result; } /** * 替换值 * * @param replace * @param result * @return */ private Object replaceValue(String[] replace, Object result) { if (replace != null && replace.length > 0) { String temp = String.valueOf(result); String[] tempArr; for (int i = 0; i < replace.length; i++) { tempArr = replace[i].split("_"); if (temp.equals(tempArr[0])) { return tempArr[1]; } } } return result; } }

你可能感兴趣的:(笔记,list,数据结构,java,ide,经验分享)