项目开发中,Excel导入导出一直是比较重要并且常见的一个功能,之前在项目开发中一直使用的是Apache poi,最近发现alibaba推出的一个框架Easy Excel ,官网地址:EasyExcel官网,好奇心驱使下想尝试着使用一下。经过一段时间使用之后现将自己使用过程中感觉到的优缺点总结一下。
优点:EasyExcel正如他官网宣称的那样特别节省内存,而且如果你的excel表格是比较规整的数据并且列正好和你java实体类的字段对应的比较好,那使用这个框架还是比较方便,加上简单的注解,几行代码就可以很方便的将数据导入导出。
缺点:社区不够完善,目前只有官网的文档,网上搜帖子也基本都是官网的例子拿来简单修改一下,遇到问题得自己研究解决。针对比较特殊的需求 比如导入导出图片、单元格格式的设置不是很方便。
最近在使用过程中遇到了一个坑,项目中我使用的持久层框架是MybatisPlus 利用代码生成器生成的时间类型是LocalDateTime,
在excel中时间格式形如2020/01/20(日期类型) 或者 2020-01-20(文本类型)这就导致直接导入会报错。
报错如下:
试了好多次,找到了两种解决方案:
1、将java类中字段类型由LocalDateTime改为String,这样可以直接读取excel日期数据,并且改为String类型之后并不影响数据入库,数据库可以识别String并转为日期类型(mysql5.7),而且这样还有好处就是省去了很多字符串转LocalDateTime的工作。最重要的是不影响时间的比较。
2、自己写一个converter
/**
* @ClassName LocalDateTimeConverter
* @Description EasyExcel LocalDateTime转换器
* @Author amx
* @Date 2020/9/17 6:10 下午
**/
public class LocalDateTimeConverter implements Converter<LocalDateTime> {
private static final String DEFAULT_PATTERN = "yyyy-MM-dd";
@Override
public Class supportJavaTypeKey() {
return null;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return null;
}
@Override
public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DEFAULT_PATTERN);
LocalDate localDate = LocalDate.parse(cellData.getStringValue(),dateTimeFormatter);
LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.of(00,00));
return localDateTime;
}
@Override
public CellData convertToExcelData(LocalDateTime localDateTime, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return null;
}
}
然后在你项目java实体中导入的字段注解中加入这个转换器即可:
以上。