您的位置:

EasyExcel读取Excel详解

一、从EasyExcel读取Excel数据

EasyExcel是一个基于Java语言的开源的Excel读写工具。它提供了简单的API来操作Excel文件,而且相比于Apache POI等其他同类工具,EasyExcel的速度更快,功能更齐全。下面我们将从从EasyExcel读取Excel数据这个方面,来详细讲解。

首先,我们需要引入EasyExcel的依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.10</version>  
</dependency>

接下来,我们就可以使用EasyExcel来读取Excel数据了。下面是一个简单的示例:

// 创建一个Excel读取器
ExcelReader excelReader = EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).build();
// 读取数据
excelReader.read();
// 关闭读取器
excelReader.finish();

在上面的示例中,我们使用了EasyExcel提供的ExcelReader来读取Excel文件,并且传入了Excel文件路径、数据对象的类型和数据监听器。在这里,DemoDataListener是数据监听器,它实现了EasyExcel提供的AnalysisEventListener接口,用于解析Excel数据。

二、跳过Excel表头读取数据

在实际的应用中,我们通常需要从Excel文件中获取数据,并且需要跳过表头。EasyExcel提供了skipHeadRows()方法来实现这个功能。下面是一个示例:

ExcelReader excelReader = EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).sheet().headRowNumber(1).doRead();

在这个示例中,我们使用了sheet()方法来获取Excel表格,然后使用headRowNumber()方法指定表头所在行的索引是1,最后使用doRead()方法来读取数据,并且跳过了表头。

三、从Excel模板读取数据并写入

除了从Excel文件中读取数据,EasyExcel还可以从Excel模板中读取数据,并且将数据写入到Excel文件中。下面是一个示例:

// 定义模板对象
ExcelTemplate excelTemplate = ExcelTemplateFactory.fromClasspath("template.xlsx").defaultSheet();
// 导出数据到Excel文件
excelTemplate.writer()
        .put("title", "XXX公司员工信息表")
        .put("companyName", "XXX公司")
        .put("date", new Date())
        .fill().finish();

在这个示例中,我们使用了ExcelTemplate来读取指定路径下的Excel模板文件,然后使用put()方法将数据写入到Excel模板中,并且使用fill()方法将数据写入到Excel文件中。

四、读取Excel内容

在读取Excel数据时,我们通常会遇到两种类型的数据:字符串和数字。EasyExcel提供了Formatter实现类,可以将读取到的字符串和数字格式化为Java对象。下面是一个示例:

@Data
public class DemoData {
    @ExcelProperty(value = "字符串标题", index = 0)
    private String string;
    @ExcelProperty(value = "数字标题", index = 1)
    private Double doubleData;
}

public class DemoDataListener extends AnalysisEventListener<DemoData> {
    @Override
    public void invoke(DemoData demoData, AnalysisContext analysisContext) {
        System.out.println(demoData);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}

ExcelReader excelReader = EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).build();
excelReader.read();
excelReader.finish();

在这个示例中,我们定义了DemoData数据类,并且使用@ExcelProperty注解指定Excel数据的列名和列索引。然后在DemoDataListener监听器中重写invoke()方法,用来读取Excel数据并转换为Java对象。最后,在ExcelReader中读取数据并使用DemoDataListener监听器进行解析。

五、读取Excel数据为空处理

在读取Excel文件时,我们可能会遇到Excel表格中数据为空的情况,这时我们需要对空数据进行处理。EasyExcel提供了数据转换接口来实现这个功能。下面是一个示例:

public class DemoDataListner extends AnalysisEventListener {
    @Override
    public void invoke(Object obj, AnalysisContext context) {
        if (obj instanceof List) {
            List list = (List)obj;
            if (CollectionUtils.isEmpty(list)) {
                // Do something
            }
        }
    }
}

在这个示例中,我们在DemoDataListener数据监听器中重写了invoke()方法,在读取数据之前先校验数据是否为空。如果数据为空,我们就可以在这里进行相应的处理。

六、读取复杂Excel

在实际的应用中,Excel文件中可能会存在很多复杂的情况,比如单元格合并、多行标题、嵌套表格等。EasyExcel提供了一系列的接口来支持这些复杂的情况。下面是一个示例:

@Data
public class DemoData {
    @ExcelProperty(value = {"表头1", "子表头1", "子子表头1"}, index = 0)
    private String string;
    @ExcelProperty(value = {"表头1", "子表头1", "子子表头2"}, index = 1)
    private Double doubleData;
    @ExcelProperty(value = {"表头1", "子表头2"}, index = 2)
    private String string1;
    @ExcelProperty(value = {"表头2", "子表头"}, index = 3)
    private String string2;
}

public class DemoDataListener extends AnalysisEventListener<DemoData> {
    @Override
    public void invoke(DemoData demoData, AnalysisContext context) {
        System.out.println(demoData);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {}
}

ExcelReader excelReader = EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).build();
excelReader.read();
excelReader.finish();

在这个示例中,我们使用了@ExcelProperty注解指定Excel数据的列名和列索引,并且使用value属性来支持多行标题。

七、EasyExcel模板导出

在实际的应用中,我们通常需要将数据导出到Excel模板中。EasyExcel提供了一个简单的API来实现这个功能。下面是一个示例:

// 定义Excel导出器
ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateInputStream).build();
// 写入数据
excelWriter.fill(data, new FillConfig().setForceNewRow(Boolean.TRUE));
// 关闭Excel导出器
excelWriter.finish();

在这个示例中,我们使用了ExcelWriter来将数据写入到Excel模板中,并且使用fill()方法来填充数据。注意,在填充数据时,我们需要使用FillConfig实例来指定新的行必须写入数据。

八、EasyExcel导入数据库

在读取Excel数据后,我们需要将数据存储到数据库中。EasyExcel提供了简单的API来实现这个功能。下面是一个示例:

@Data
public class DemoData {
    @ExcelProperty(value = "用户名", index = 0)
    private String username;
    @ExcelProperty(value = "密码", index = 1)
    private String password;
}

public class DemoDataListener extends AnalysisEventListener<DemoData> {
    @Override
    public void invoke(DemoData demoData, AnalysisContext context) {
        System.out.println(demoData);
        // 保存数据到数据库
        User user = new User();
        user.setUsername(demoData.getUsername());
        user.setPassword(demoData.getPassword());
        userRepository.save(user);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {}
}

ExcelReader excelReader = EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).build();
excelReader.read();
excelReader.finish();

在这个示例中,我们使用了DemoData数据类存储Excel数据,并且通过DemoDataListener数据监听器将数据保存到数据库中。