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

本文主要是介绍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 (qrb.jueyue@gmail.com)* <p>* 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* <p>* http://www.apache.org/licenses/LICENSE-2.0* <p>* 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;}
}

这篇关于Easypoi map方式导入数据 ,List<Map<String, String>> 日期项数据为空(null)解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381442

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_