一、EasyExcel

1. 引入依赖

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

2. 读取Excel

2.1 读取方式一

这种方式在实际开发中用的比较少。

	@Test
    public void readTest() {

        // 创建 ExcelReaderBuilder 实例
        ExcelReaderBuilder readerBuilder = EasyExcel.read();

        // 读取文件对象
        readerBuilder.file("D:\\Works\\javalianxi\\a\\b\\c\\学生信息表.xlsx");

        // 指定sheet
        // 可以是名字,也可以是索引
        readerBuilder.sheet(0);

        // 自动关闭输入流
        readerBuilder.autoCloseStream(true);

        // 设置 Excel 文件格式
        readerBuilder.excelType(ExcelTypeEnum.XLSX);

        // 注册监听器进行数据的解析
        readerBuilder.registerReadListener(new AnalysisEventListener<Map<Integer, String>>() {

            @Override
            public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
                Set<Integer> keySet = integerStringMap.keySet();

                Iterator<Integer> iterator = keySet.iterator();

                while (iterator.hasNext()) {
                    Integer key = iterator.next();

                    System.out.print(key + ":" + integerStringMap.get(key) + ", ");
                }
                System.out.println();
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                // 通知文件读取完毕
                System.out.println("数据读取完毕");
            }
        });

        // 构建读取器
        ExcelReader reader = readerBuilder.build();

        // 读取数据
        reader.readAll();

        // 读取完毕
        reader.finish();

    }

2.2 读取方式二

这种方式,没有对应的实体类映射。

@Test
    public void testReadExcel() {
        List<Map<Integer, String>> list = new LinkedList<>();
        EasyExcel.read("D:\\Works\\javalianxi\\a\\b\\c\\学生信息表.xlsx")
                .sheet()
                .registerReadListener(new AnalysisEventListener<Map<Integer, String>>() {

                    @Override
                    public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
                        list.add(integerStringMap);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("数据读取完毕");
                    }
                }).doRead();
        for (Map<Integer, String> integerStringMap : list) {
            Set<Integer> keySet = integerStringMap.keySet();
            Iterator<Integer> iterator = keySet.iterator();
            while (iterator.hasNext()) {
                Integer key = iterator.next();
                System.out.println(key + ":" + integerStringMap.get(key) + ", ");
            }
            System.out.println();
        }
    }

2.3 读取方式三

这种方式在实际开发中用的比较多。

实体类

@Data
public class ExcelData {

    @ExcelProperty("学号")
    private String id;

    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("联系方式")
    private String phone;

    @ExcelProperty("入学时间")
    private String startDate;

    @ExcelProperty("身份证号码")
    private String idCard;

    @ExcelProperty("邮件")
    private String email;
}

提示:用到了@Data注解,需要在pom.xml中引入lombok依赖。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
	@Test
    public void test() {
        List<ExcelData> list = new LinkedList<>();
        EasyExcel.read("D:\\Works\\javalianxi\\a\\b\\c\\学生信息表.xlsx")
                .head(ExcelData.class)
                .sheet()
                .registerReadListener(new AnalysisEventListener<ExcelData>() {

                    @Override
                    public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
                        list.add(excelData);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("数据读取完毕");
                    }
                }).doRead();
        for (ExcelData excelData : list) {
            System.out.println(excelData);
        }
    }

2. 写入Excel

这里演示一下备份excel,即将一个excel中的数据都写入到另一个excel中。

public List<ExcelData> parseData() {
        List<ExcelData> list = new LinkedList<>();
        EasyExcel.read("D:\\Works\\javalianxi\\a\\b\\c\\学生信息表.xlsx")
                .head(ExcelData.class)
                .sheet()
                .registerReadListener(new AnalysisEventListener<ExcelData>() {

                    @Override
                    public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
                        list.add(excelData);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("数据读取完毕");
                    }
                }).doRead();
        return list;
}

在主类中调用该方法。

@SpringBootApplication
public class Poi01Application {

    public static void main(String[] args) {

        SpringApplication.run(Poi01Application.class, args);

        ExcelTest excel = new ExcelTest();

        List<ExcelData> list = excel.parseData();

        // list写入Excel文件
        EasyExcel.write("D:\\Works\\javalianxi\\a\\b\\c\\学生信息表_副本.xlsx")
                .head(ExcelData.class)
                .excelType(ExcelTypeEnum.XLSX)
                .sheet()
                .doWrite(list);
    }
}

Q.E.D.


热爱生活,热爱程序