之前在文章中简单的介绍过EasyExcel的导出与导入方法,导出一般比较容易理解,导入的方法对于新手来说就有一些困难,接下来我介绍一下easyExcel的导入难点,展示一下工作中如何使用。
如果还不了解导入的内容,请看这篇文章
EasyExcel的导出与导入
解决方法:在Excel的实体映射类中,使用下面的注解,会只取表头为此值的列,其他列自动忽略。
@ExcelProperty(value = "表头1")
难点二 导出导入数据类型转换
在导出的过程中,我们会碰到如下报错
com.alibaba.excel.exception.ExcelDataConvertException: Can not find 'Converter' support class LocalDateTime.
at com.alibaba.excel.write.executor.AbstractExcelWriteExecutor.doConvert(AbstractExcelWriteExecutor.java:108)
at com.alibaba.excel.write.executor.AbstractExcelWriteExecutor.convert(AbstractExcelWriteExecutor.java:93)
at com.alibaba.excel.write.executor.AbstractExcelWriteExecutor.converterAndSet(AbstractExcelWriteExecutor.java:39)
at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addJavaObjectToExcel(ExcelWriteAddExecutor.java:137)
at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addOneRowOfDataToExcel(ExcelWriteAddExecutor.java:65)
at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.add(ExcelWriteAddExecutor.java:51)
报错的原因我们也可以发现是因为EasyExcel暂不支持LocalDateTime数据类型,所以无法进行转换(默认支持Date类型),此时我们需要开发一个Converter转换器对数据进行转换。
/**
* 实现Converter接口使类变为转换器,泛型为需要转换的字段类型
*/
public final class LocalDateTimeConverter implements Converter<LocalDateTime> {
private static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Override
public Class<LocalDateTime> supportJavaTypeKey() {
return LocalDateTime.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 导入时转换为Java对象
* @param cellData
* @param contentProperty
* @param globalConfiguration
* @return
*/
@Override
public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern(getFormat(contentProperty)));
}
/**
* 导出时转换为Excel对象
* @param value
* @param contentProperty
* @param globalConfiguration
* @return
*/
@Override
public CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return new CellData<>(value.format(DateTimeFormatter.ofPattern(getFormat(contentProperty))));
}
/**
* 类型转换方法
* @param contentProperty
* @return
*/
private String getFormat(ExcelContentProperty contentProperty) {
if (contentProperty == null) {
return DEFAULT_FORMAT;
}
if (contentProperty.getDateTimeFormatProperty() == null) {
return DEFAULT_FORMAT;
}
return contentProperty.getDateTimeFormatProperty().getFormat();
}
}
我们创建之后,在导出对象的上面添加如下代码
@ExcelProperty(value = "到期时间", index = 22, converter = LocalDateTimeConverter.class)
@ColumnWidth(value = 20)
@ApiModelProperty(name = "validDate", value = "到期时间")
private LocalDateTime validDate;
难点三 如何获得导入的对象列表或想要的信息
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE,proxyMode = ScopedProxyMode.TARGET_CLASS)
public class OverLockRuleListener extends AnalysisEventListener<泛型> {
//创建列表属性,将数据传入属性中
private List<实体类> result = new ArrayList<>();
//创建列表属性的get()方法,进行取参数
public List<实体类> getResult() {
return result;
}
@Override
public void invoke(实体类 data, AnalysisContext context) {
result.add(data);
//每读取一条数据后执行
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//excel读取完毕后执行
}
}
解决方法:创建属性,进行数据的保存,然后通过get()方法在Service层进行数据的读取。注意*需要将监听器配置为多例模式
若不创建为多例模式,则每次读取的数据都会保存在监听器的列表里。
难点四 自定义导出表头表体样式
我们在日常的导出中,导出的数据格式不一定统一,默认样式可能为如下所示
我们可能希望去除表头样式,或让表体字段居中等操作,我们可以使用如下方法
WriteCellStyle writeCellStyle = new WriteCellStyle();
// 设置表体字段居中
writeCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
EasyExcelFactory.write(outStream, 导出类类名.class).sheet("sheet1")
.registerWriteHandler(new HorizontalCellStyleStrategy(new WriteCellStyle(), writeCellStyle))
.doWrite(resultExcel.getData());
使用 .registerWriteHandler(new HorizontalCellStyleStrategy(new WriteCellStyle(), writeCellStyle)) 方法,自定义表头与表体样式。
需要注意的是 new HorizontalCellStyleStrategy(表头样式,表体样式) 方法如果 想要保留表头的样式,我们需要传入一个new 对象 ,如果 不需要任何样式则传入null,表体样式同理。
最后我简单介绍几个API
//设置背景颜色
headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
//设置头字体
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontHeightInPoints((short)13);
headWriteFont.setBold(true);
headWriteCellStyle.setWriteFont(headWriteFont);
//设置头居中
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
--------------------------------------------------
//内容策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
//表体设置 水平居中
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
如果您这边需要修改Excel的样式很复杂,则还是可以回到POI,使用POI的方法,这里也写了POI方法的使用。
JavaPOI导出Excel合集——Java导出全内容