Easy-Excel 和 Hutool-Excel读取Excel(最简单Excel)

EasyExcel 和 Hutool工具中封装的Excel工具,读取最简易excel数据。
Excel信息如下:

image.png

读成的结果:

image.png

需要依赖

cn.hutoolhutool-allcom.alibabaeasyexcel3.3.2org.projectlomboklombok

直接读取为实体类

tip:不涉及合并单元格、表头一致。
创建表头对应实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestDomainEasyExcelDomain {
    @ExcelProperty(index = 0)
    private String serialNum;
    @ExcelProperty(index = 1)
    private String code;
    @ExcelProperty(index = 2)
    private String name;
}

Case1,不写监听器。

缺点:这个不能设置sheet页

public static void easyExcelRead() throws IOException {
        String filePath = "test.xlsx";
        Path path = Paths.get(filePath);
        InputStream inputStream = Files.newInputStream(path);

        List list = EasyExcel
                .read(inputStream)
                .head(TestDomainEasyExcelDomain.class)
                .headRowNumber(1)
                .doReadAllSync();

        System.out.println(JSONUtil.toJsonPrettyStr(list));
    }

Case2 可以指定sheet页。【需要自定义监听器】

public class MyLevel1Listener extends AnalysisEventListener{
    private List dataList = new ArrayList();

    /**
     * When analysis one row trigger invoke function.
     *
     * @param data    one row value. It is same as {@link AnalysisContext#readRowHolder()}
     * @param context analysis context
     */
    @Override
    public void invoke(TestDomainEasyExcelDomain data, AnalysisContext context) {
        dataList.add(data);
    }

    /**
     * if have something to do after all analysis
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("读取数据完成");
    }

    public List getDataList() {
        return dataList;
    }
}

读取代码:

public static void easyExcelReadWithSheet() throws IOException {
    String filePath = "test.xlsx";
    Path path = Paths.get(filePath);
    InputStream inputStream = Files.newInputStream(path);
    MyLevel1Listener listener = new MyLevel1Listener();

    EasyExcel
            .read(inputStream)
            .head(TestDomainEasyExcelDomain.class)
            .headRowNumber(1)
           .registerReadListener(listener)
            .sheet(0)
            .doRead();
    List dataList = listener.getDataList();

    System.out.println(JSONUtil.toJsonPrettyStr(dataList));


}

Case3 Hutool方式

读取代码:

/**
 * hutool-excel读取
 */
public static void hutoolExcelRead() throws IOException {

    String filePath = "test.xlsx";
    Path path = Paths.get(filePath);
    InputStream inputStream = Files.newInputStream(path);

    // 读取指定sheet
    ExcelReader reader = ExcelUtil.getReader(inputStream, 0);
    // 这里需要自设置别名 --> 自定义注解
    Map aliasMap =
            HutoolExcelUtils.aliasAnnotation2Map(TestDomainEasyExcelDomain.class);
    reader.setHeaderAlias(aliasMap);
    List list = reader.readAll(TestDomainEasyExcelDomain.class);


    System.out.println(JSONUtil.toJsonPrettyStr(list));
}

这里使用Hutool工具类来进行读取,还需要添加三个代码:
1、自定义注解:HutoolExcelAlias。
2、在实体类上添加自定义注解。
3、将注解内容转成Map(Hutool 需要表头的alia)的工具类:HutoolExcelUtils。

自定义注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface HutoolExcelAlias {
    String alias();
}

在实体类添加自定义注解

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestDomainEasyExcelDomain {
    @HutoolExcelAlias(alias = "序号")
    private String serialNum;
    @HutoolExcelAlias(alias = "代号")
    private String code;
    @HutoolExcelAlias(alias = "名称")
    private String name;
}

将注解内容转成Map(Hutool 需要表头的alias)的工具类:

public class HutoolExcelUtils {
    public static  Map aliasAnnotation2Map(Class myClass){
        Field[] fields = ReflectUtil.getFields(myClass);
        Map map = MapUtil.newHashMap();
        for (Field f: fields){
            if (AnnotationUtil.hasAnnotation(f, HutoolExcelAlias.class)){
                HutoolExcelAlias annotation = AnnotationUtil.getAnnotation(f, HutoolExcelAlias.class);
                map.put(annotation.alias(), f.getName());
            }
        }
        return map;
    }
}

完整代码见GIT:完整代码地址

【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容