excel在工作中比较常用了,对于需要批量导入的需求,一般都是使用excel。excel导入常用poi,但是POI使用繁琐,而且对内存消耗大,这篇文章就是使用easyexcel来解析数据
场景一:将数据批量导出,生成excel,输出到本地
首先导入easyexcel的pom依赖,接下来就开始解析excel了
第一步,创建excel中需要输出的字段,构建java实体
//使用easyexcel写数据,需要先建立表格对应的实体类

public class ExcelEntity {
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;
    @ExcelProperty("分数")
    private Integer score;
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }

    public String getIgnore() {
        return ignore;
    }

    public void setIgnore(String ignore) {
        this.ignore = ignore;
    }

    @Override
    public String toString() {
        return "WriteExcelEntity{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                ", ignore='" + ignore + '\'' +
                '}';
    }
}

第二步,将数据封装到excel中,然后将excel输出到本地

/**
 * 往excel表格里写入数据
 */
public class WriteExcelService {
    //将需要输出的数据写入list
    private List<ExcelEntity> data(){
        List<ExcelEntity> list=new ArrayList<ExcelEntity>();
        for (int i=0;i<10;i++){
            ExcelEntity writeExcelEntity=new ExcelEntity();
            writeExcelEntity.setName("李白"+i);
            writeExcelEntity.setAge(10+i);
            writeExcelEntity.setScore(60+i);
            list.add(writeExcelEntity);
        }
        return list;
    }
    //将list中的值写入excel,生成excel
    @Test
    public void simpWrite(){
        //指定输出的excel的路径以及名称
        String fileName="D:/分数统计表.xlsX";
        //指定按照哪个实体写数据,默认写入第一个sheet,并指定sheet名称
        EasyExcel.write(fileName,ExcelEntity.class).sheet("分数统计").doWrite(data());
    }
}

这样就将数据导出到本地了

场景二:解析excel中的数据,转化为java字段
第一步:创建excel中字段的java实体类

public class ExcelEntity {
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;
    @ExcelProperty("分数")
    private Integer score;
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }

    public String getIgnore() {
        return ignore;
    }

    public void setIgnore(String ignore) {
        this.ignore = ignore;
    }

    @Override
    public String toString() {
        return "WriteExcelEntity{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                ", ignore='" + ignore + '\'' +
                '}';
    }
}

第二步:创建excel监听器

/**
 * 使用easyexcel读取数据需要先建立监听器监听excel
 */
public class ReadExcelListener extends AnalysisEventListener<ExcelEntity> {
    //如果有需要将读取到的数据插入数据库的话,默认是每5条插入数据库
    private static  final int BATCH_SIZE =5;
    List<ExcelEntity> list=new ArrayList<ExcelEntity>();
//
        //这里就不插入数据库里了,直接将读取的数据输出出来作为演示
    /**
     *自动注入dao
     *
     */
    @Autowired
   private ExccelMapper excelMapper;
//   public ReadExcelListener(){
//        excelMapper=new ExccelMapper();
//    }
//    public ReadExcelListener(){
//        this.excelMapper=excelMapper;
//    }
    /**
     * 数据读取的核心方法,读取数据会执行这个方法
     * ExcelEntity:表格对应的实体
     * AnalysisContext:分析上下文
     * @param excelEntity
     * @param analysisContext
     */
    @Override
    public void invoke(ExcelEntity excelEntity, AnalysisContext analysisContext) {
        //将读取到的数据输出,JSON.toJSONString(excelEntity就是通过fastjson将数据转化
        System.out.println(JSON.toJSONString(excelEntity));
        list.add(excelEntity);
        //当读取的数据量达到设定的批量规模后,执行插入数据库方法,
        // 否则将读取的数据都读取出来不插入的话,容易造成内存溢出,下面入库的方法这里就不写了
//        if (list.size()>=BATCH_SIZE){
//            excelMapper.saveData(list);
//            //将插入成功的数据从list清除掉
//            list.clear();
//        }
    }

    /**
     * 所有数据读取完了都会调用的方法
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
           //在这里也要保存数据,确保最后遗留的数据也存储到数据库
        //excelMapper.saveData(list);
        System.out.println("所有数据解析完成");
    }
}

第三步:编写插入数据入库的代码

@Service
/**
 * 在实际开发中,还是要按照mvc的规范来写数据的持久化,
 * 这里只要是为了方便演示效果,就不写入库的操作了
 */
public class ExccelMapper  {
    //持久化操作
    public void saveData(List<ExcelEntity> list){};
}

第四步:解析数据

public class ReadExcelService {

    @Test
    public void simpleRead(){
        //需要读取的数据,在实际开发中应该是先上传excel文件,再解析excel,这里就直接指定本地的文件了
        String fileName="D:/分数统计表.xlsX";
        //这里需要指定读取的文件,用哪个class去读,
        // 读取第几个sheet的数据,默认是第一个sheet
        EasyExcel.read(fileName,ExcelEntity.class,new ReadExcelListener()).sheet().doRead();
    }
}

上面代码只是例子,实际开发中,需要自己根据业务字段做相应处理变动。但是步骤和代码里的方法是不变的、
大家有什么不懂的可以问我

GitHub 加速计划 / ea / easyexcel
14
5
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:4 个月前 )
c42183df Bugfix 4 个月前
efa7dff6 * 重新加回 `commons-io` 4 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐