EasyExcel导入实战问题汇总

之前在文章中简单的介绍过EasyExcel的导出与导入方法,导出一般比较容易理解,导入的方法对于新手来说就有一些困难,接下来我介绍一下easyExcel的导入难点,展示一下工作中如何使用。

如果还不了解导入的内容,请看这篇文章
EasyExcel的导出与导入


难点一 导入的Excel有备注内容,需要忽略
EasyExcel导入实战问题汇总_第1张图片

解决方法:在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;

EasyExcel导入实战问题汇总_第2张图片设置完成,即可成功导出。

难点三 如何获得导入的对象列表或想要的信息

@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层进行数据的读取注意*需要将监听器配置为多例模式

不创建为多例模式,则每次读取的数据都会保存在监听器的列表里

难点四 自定义导出表头表体样式
我们在日常的导出中,导出的数据格式不一定统一,默认样式可能为如下所示
EasyExcel导入实战问题汇总_第3张图片我们可能希望去除表头样式,或让表体字段居中等操作,我们可以使用如下方法

            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导出全内容

你可能感兴趣的:(Web后端组件,java,excel)