EasyExcel数据导入

前言:

我先讲一种网上信息的获取方式把,虽然我感觉和后面的EasyExcel没有什么关系,可能是因为这个项目这个操作很难实现,不过也可以在此记录一下,如果需要再拆出来也行。

看上了网页信息,怎么抓到?

分析原网站如何获取信息,用了那些接口:

以知识星球用户举例:

打开F12进入控制台

这里可以刷新页面,这个页面的请求就来了

 

复制url

 

 这里推荐一个前端插件:Fehelper

在浏览器插件商店应该就可以直接下载了

这个插件的作用就是格式化上面的数据,要不然我们看到的就是一堆乱码

到此,这个网页的信息就全在这个里面了。

下面才是这篇文章的重点:

EasyExcel: 

首先接触到了一个新的东西(技术)

肯定是看官方文档:

关于Easyexcel | Easy Excel 官网

1:第一步也是引入依赖:

        <!-- easy Excel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.0</version>
        </dependency>
这里也有一个小插曲:

就是我在找这个依赖的时候,我网好卡,打不开那个官网,所以,我就直接到maven repository官网里面直接去找了。

在此也贴一下这个步骤把

 

选取一个用的人多的,稳定点的 

2:第二步获取一个最简单读的对象:

这里为什么叫最简单读的对象,其实是因为官网上这么说的哈哈哈

package com.usercenter.usercenterproject.once;


import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
 */
@Data
public class XingQiuTableUserInfo {
    /**
     * id
     */
    @ExcelProperty("成员编号")
    private String planetCode;

    /**
     * 用户昵称
     */
    @ExcelProperty("成员昵称")
    private String username;

}

 直接复制过来即可

这里需要说明一下@ExcelProperty这个注解

@ExcelProperty 注解是用来指定 Excel 文件中的某一列与 Java 对象中的成员变量之间的映射关系的

什么意思呢?

先查看一下我们后面要操作的excel表格:

就是将这两列映射到代码中对应的变量上

3:第三步就是开始读取数据了:

这里有两种方法:

第一种是监听器

第二种是同步的读取

先介绍第一种:
监听器: 
package com.usercenter.usercenterproject.once;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.extern.slf4j.Slf4j;

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class TableListener implements ReadListener<XingQiuTableUserInfo> {

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(XingQiuTableUserInfo data, AnalysisContext context) {
        System.out.println("数据是:"+data);
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("已监听完成");
    }
}

还是到官网复制代码:复制完之后重写invoke和doAfterAllAnalysed方法

 开始读取:
public class ImportExcel {
    public static void main(String[] args) {
        //Excel数据文件放在自己电脑上,能够找到的路径
        String fileName = "D:\\User-Center-Code\\UserCenterProject\\src\\main\\resources\\testExcel.xlsx";
        readByListener(fileName);
    }
    private static void ReadByListener(String fileName){
        EasyExcel.read(fileName, XingQiuTableUserInfo.class, new TableListener()).sheet().doRead();
    }
}

文件名直接是excel的绝对路径

这一段也是去官网复制的,自己需要稍作修改即可

第二种方法:
同步读取
public class ImportExcel {
    public static void main(String[] args) {
        //Excel数据文件放在自己电脑上,能够找到的路径
        String fileName = "D:\\User-Center-Code\\UserCenterProject\\src\\main\\resources\\testExcel.xlsx";
//          readByListener(fileName);
        synchronousRead(fileName);
    }

    /**
     * 同步的返回,不推荐使用,如果数据量大会把数据放到内存里面
     */
    public static void synchronousRead(String fileName) {
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finish
        List<XingQiuTableUserInfo> list = EasyExcel.read(fileName).head(XingQiuTableUserInfo.class).sheet().doReadSync();
        for (XingQiuTableUserInfo info : list) {
            System.out.println(info);
        }
    }
}

同步读取时不需要监听器的,直接将所有数据同时读到内存中。

最后我们再对这两个方法进行比较一下:

两种读取模式:

  1. 监听器:先创建监听器、在读取文件时绑定监听器。

        单独抽离处理逻辑,代码清晰易于维护;一条一条处理,适用于数据量大的场景。

  1. 同步读:无需创建监听器,一次性获取完整数据。

        方便简单,但是数据量大时会有等待时常,也可能内存溢出。

 

上一篇:【人工智能学习之图像操作(一)】


下一篇:006 动态数组(lua)-实际应用