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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/136764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux - 实现一个简单的 shell

前言 之前我们对进程的替换&#xff0c;进程地址空间等等的概念进行了说明&#xff0c;本篇博客会基于这些知识点来 实现一个简单的 shell &#xff0c;如有疑问&#xff0c;可以参考下述博客&#xff1a;Linux - 进程程序替换 - C/C 如何实现与各个语言之间的相互调用 - 替换…

flutter实践:慎用Expanded

问题&#xff1a;在一个Android原生的弹框里显示flutter view,由于使用了Expanded导致组件未显示出来 最神奇的地方在于debug调试模式显示正常&#xff0c;然后用release版本发布时怎么都显示不出来&#xff0c;还导致点击后无响应ANR 问题代码&#xff1a; child: Stateful…

【服务器学习】 iomanager IO协程调度模块

iomanager IO协程调度模块 以下是从sylar服务器中学的&#xff0c;对其的复习&#xff1b; 参考资料 继承自协程调度器&#xff0c;封装了epoll&#xff0c;支持为socket fd注册读写事件回调函数 IO协程调度还解决了调度器在idle状态下忙等待导致CPU占用率高的问题。IO协程调…

后台管理系统解决方案-中大型-Vben Admin

后台管理系统解决方案-中大型-Vben Admin 官网 Vben Admin 在线演示 Vben Admin 为什么选择它 github现有20K星&#xff0c;并且它有个可视化生成表单&#xff0c;我很喜欢 快速开始 # 拉取代码 git clone https://github.com/vbenjs/vue-vben-admin-doc# 安装依赖 yarn#…

访问控制列表

目录 ACL ACL原理 ACL包过滤方式 ACL通用命令 查看ACL表命令 删除整张表命令 接口配置ACL ACL分类 标准ACL 标准ACL的动作与条件 通配符掩码 扩展ACL 扩展ACL的动作与条件 命名ACL 前言 书写方式 ACL 含义&#xff1a;访问控制列表&#xff0c;其是一种包过滤…

idea module 重命名

在多模块的项目中&#xff0c;要对多模块的其中一个模块&#xff0c;进行重命名。 试了直接重命名&#xff0c;还是显示旧的。再是了下什么引入模块的方法&#xff0c;都不好使。看到《IDEA重命名一个模块(详细说明)》&#xff0c;操作起来&#xff0c;其实就比较麻烦。 索性&a…

竞赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习行人重识别(person reid)系统 该项目…

某环保制造企业核心人才培养项目成功案例纪实

——如何培养核心人才&#xff0c;使企业持续保持竞争力 【客户行业】环保行业 【问题类型】人才培养 【客户背景】 某环保有限公司成立于2002年&#xff0c;位于南方某二线城市&#xff0c;是一家以处理废弃物、废旧资源为主的设备制造的民营企业&#xff0c;拥有从事专业…

【C++】STL容器适配器——queue类的使用指南(含代码使用)(18)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一、queue 类——基本介绍二、queue 类…

Nginx 单个端口代理Minio

背景 最近使用某运营商的云服务器作为正式环境服务器&#xff0c;申请的时候只申请了一个端口&#xff0c;我们的前端页面及后台服务&#xff0c;还有minio&#xff0c;都需要nginx代理这个端口去进行访问。 server {# 监听端口7878listen 7878;server_name localhost;# 前端…

【赠书第3期】用ChatGPT轻松玩转机器学习与深度学习

文章目录 前言 1 机器学习 2 深度学习 3 使用ChatGPT进行机器学习和深度学习 4 推荐图书 5 粉丝福利 前言 机器学习和深度学习是当前最热门的技术领域之一&#xff0c;这些技术正在不断地改变我们的生活和工作方式。ChatGPT 是一款基于大规模预训练模型的自然语言处理工…

(const char *format, ...) 可变参数在文本日志中的巧妙使用

1. va_list是C语言中的一个数据类型&#xff0c;用于处理可变参数列表。它通常与stdarg.h头文件一起使用&#xff0c;该头文件提供了一组宏和函数来处理可变参数。 va_list类型用于存储一系列类型未知的参数&#xff0c;这些参数可以是任意类型&#xff0c;包括整数、浮点数、…

java读取pdf数据

目录 读取方式有两种: 方式一: 方式一所需要的maven依赖如下: 方式一读取的Java代码如下: 方式二: 方式二所需要的maven依赖如下:

ubuntu连接蓝牙耳机

本人也是经历了重重困难&#xff0c;特写此篇希望对读者能够带来帮助 1. 编辑 /etc/bluetooth/main.conf 文件&#xff0c;设定ControllerMode bredr 这一步使用vim编写完成后&#xff0c;保存退出的时候&#xff0c;会显示说没有修改权限&#xff0c;执行以下命令 sudo chm…

【星海出品】flask 数据库问题

flask 和数据库的问题 pip install pymysql pip install flask-sqlalchemy1.Flask连接Mysql 新建flask项目&#xff0c;在app.py中编写 导入模块SQLAlchemy 创建SQLAlchemy实例对象&#xff0c;命名为db&#xff0c;将flask的实例对象app作为参数传给SQLAlchemy&#xff0c;将…

深入理解JVM虚拟机第二十一篇:详解JVM当中的操作数在栈以及分析操作数栈与字节码指令和执行引擎的关系图解

大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻JVM 本文章简介:话不多说,让我们讲清楚JVM当中的操作数在栈以及分析操作数…

【Python基础】 Python设计模式之单例模式介绍

单例模式 1.设计模式2.单例设计模式的应用场景3.new方法4. Python 中的单例 1.设计模式 设计模式 是 前人工作的总结和提炼&#xff0c;通常&#xff0c;被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案使用 设计模式 是为了可重用代码、让代码更容易被他人理…

【Qt】QPalette

2023年11月10日&#xff0c;周五上午 Palette意为“调色板”。 QPalette是Qt中用于管理控件调色板&#xff08;颜色方案&#xff09;的类。它允许你为Qt应用程序中的控件设置不同的颜色&#xff0c;以满足视觉设计需求。 QPalette可以管理各种控件的颜色属性&#xff0c;如前…

python解析xmind统计测试用例/测试点 个数及执行情况

前言&#xff1a;统计的是每个分支最后一个节点的状态 xmind版本 23.0911172 标记打开位置 标记规则如下 解释&#xff1a; res {"total": 0, "pass": 0, "fail": 0, "no_result": 0, "unfinished": 0, "now_fail…

mysql用户及权限管理(InsCode AI 创作助手)

MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;用于存储和管理大量数据。对于那些需要使用MySQL的管理员和开发人员来说&#xff0c;用户权限管理是确保数据库安全性的至关重要的一环。在本篇技术博客中&#xff0c;我们将深入探讨MySQL的用户权限管理&#xff0c…