前言:
我先讲一种网上信息的获取方式把,虽然我感觉和后面的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);
}
}
}
同步读取时不需要监听器的,直接将所有数据同时读到内存中。
最后我们再对这两个方法进行比较一下:
两种读取模式:
- 监听器:先创建监听器、在读取文件时绑定监听器。
单独抽离处理逻辑,代码清晰易于维护;一条一条处理,适用于数据量大的场景。
- 同步读:无需创建监听器,一次性获取完整数据。
方便简单,但是数据量大时会有等待时常,也可能内存溢出。